반응형

🔢 MNIST( Modified National Institute of Standards and Technology)
🧩 역할
손글씨 숫자 이미지 데이터셋, 딥러닝 입문 데이터셋
🧱 구성
- 훈련용 이미지 60,000장
- 시험 이미지 10,000장
- 28x28크기의 회색이미지(1채널) = 784픽셀
- 픽셀은 0 ~ 255
✅ 입력 데이터 살펴보기
(train_images, train_labels), (test_images, test_labels) = load_mnist(flatten = True, nomalize= Flase)
print(train_images.shape) # (60000,784)
print(train_labels.shape) # (60000, )
print(test_images.shape) # (10000,784)
print(test_labels.shape) # (10000,784)
스펙을 보면 구성 형태와 동일하다는 것을 볼 수 있다.
옵션
- normalize: 입력 이미지의 픽셀 값을 0.0 ~ 1.0으로 정규화할 지, False면 0~255
- flatten: 입력 이미지를 1차원 배열로 할 지, True면 784, False면 1 x 28 x28의 3차원 배열 형태
- one_hot_label: 원-핫 인코딩 형태, True면 정답만 1 나머지는 0, False면 일반 숫자
🔍 예측
상세 코드는 조금 건너띄고 굵직한 흐름만 살펴보자.
test_images, test_labels = get_data()
network = init_network() # 가중치와 편향 데이터 가져오기
def predict(network, input):
w1, w2, w3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
a1 = np.dot(input,w1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1,w1) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2,w1) + b3
y = softmax(a3)
return y
accuracy_cnt = 0
for i in range(len(test_images)):
y = predict(network, test_images[i])
p = np.argmax(y)
if p == test_labels[i]:
accuracy_cnt += 1
print(f"Accuracy: ${str(float(accuracy_cnt) / len(x)}") #0.9352
현재 위 코드는, predict함수에 한번에 이미지 데이터 하나씩 넣고 있다.
과정은 이렇다
test_images[i](1X784) X w1(784X50) X w2(50X100) X w3(100X10) -> Y (1X10)
여기서 만약 100개 이미지가 들어오면 어디가 바뀔까??
test_images[i](100X784) X w1(784X50) X w2(50X100) Xw3(100X10) -> Y (100X10)
이렇게 데이터 여러개를 하나로 묶는 것을 배치(batch)라 한다.
💡 배치 처리의 장점은 뭐가 있을까?
배치처리의 장점은 크게 두가지 이유가 있다.
첫번 쨰는 수치 계산 라이브러리때문이다.
이미 수치 계산 라이브러리는 계산적인 최적화가 되어 있기 떄문에, 큰 배열을 효율적으로 처리할 수 있다.
두번 째는 데이터 전송 병목을 줄일 수 있다.
단일 데이터를 여러번 보내는 것보다, 같은 양의 데이터를 한번에 보내는 것이 버스에 주는 부하를 줄여
I/O를 통해 데이트를 읽는 횟수가 줄어들어, CPU 또는 GPU의 순수 계산 수행 비율이 높아진다.
위의 코드에 배치처리 개념을 적용해보자.
test_images, test_labels = get_data()
network = init_network() # 가중치와 편향 데이터 가져오기
def predict(network, input):
w1, w2, w3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
a1 = np.dot(input,w1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1,w1) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2,w1) + b3
y = softmax(a3)
return y
accuracy_cnt = 0
batch_size = 100
for i in range(0, len(test_images), batch_size):
test_images_batch = test_images[i:i+batch_size]
y_batch = predict(network, test_images_batch)
p = np.argmax(y_batch, axis=1)
accuracy_cnt += np.sum(p == test_labels[i:i+batch_size])
print(f"Accuracy: ${str(float(accuracy_cnt) / len(x)}")
출처
https://docs.ultralytics.com/ko/datasets/classify/mnist/
MNIST 데이터셋
docs.ultralytics.com
반응형
'AI > 이론' 카테고리의 다른 글
| [신경망-손실함수] 손실함수란? (0) | 2026.01.25 |
|---|---|
| [신경망-학습] 학습이란? (0) | 2026.01.24 |
| [신경망-활성화 함수] 소프트맥스 함수 (1) | 2026.01.14 |
| [신경망] 3층 신경망 구현해보기 (0) | 2026.01.13 |
| [신경망-활성화 함수] 활성화 함수 (0) | 2026.01.12 |