MNIST는 손으로 쓴 숫자(0~9) 이미지를 담고 있는 데이터
이 숫자를 딥러닝으로 숫자가 뭔지 알아내는 코드를 작성하였어요
먼저 x_test 첫번째 사진을 들고올게요 이것 또한 코드로 작성했어요
import matplotlib.pyplot as plt
(x_train,y_train),(x_test,y_test)=tf.keras.datasets.mnist.load_data()
x_train = x_train / 255.0
x_test = x_test / 255.0
first_image = x_test[0] # x_test의 첫 번째 이미지 (28x28 크기)
plt.imshow(first_image, cmap='gray')
plt.title("first x_test data")
plt.show()
이게 첫번째 사진이래요 7이군요
이제 이걸로 딥러닝을 만들어서 7이라고 출력되게 해보겠습니다
x_train = x_train / 255.0
x_test = x_test / 255.0
- 학습 데이터: AI가 숫자를 학습하는 데 쓰이는 그림 60,000장.
- 테스트 데이터: AI가 얼마나 똑똑한지 확인하는 그림 10,000장.
- 각 사진은 28*28의 픽셀 사진으로 구성되어 있음
- 입력층(Input Layer): 숫자 그림의 픽셀(28x28 = 784개)을 읽음.
- 은닉층(Hidden Layer): 숫자를 분석하고 판단.
- 출력층(Output Layer): 0~9 중 어떤 숫자인지 확률로 답을 줌.
- 1. 픽셀 값이란?
- 0: 완전 검정색.
- 255: 완전 흰색.
- 그 사이 값: 회색(어두운 회색 → 밝은 회색).
- MNIST 데이터에서 이미지는 흑백으로 이루어진 숫자 그림
그림의 **각 점(픽셀)**은 0~255 사이 값을 가지고 있음 - 딥러닝에서는 큰 값을 싫어하기 때문에 0과 1사이의 값으로 변환을 해줘야함
- 완전 흰색 255 % 255 = 1
- 회색 127 % 255 = 약 0.5
- 완전 검은색 0 % 255 = 0 이런식으로 해주야함
model = tf.keras.Sequential([tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(32,activation='relu'),
tf.keras.layers.Dense(32,activation='relu'),
tf.keras.layers.Dense(10,activation='softmax')])
내가 만든 모델
첫번째 Flatten은 2D 이미지를 1D 벡터로 펼쳐주는 층.
사진은 2D인데 딥러닝의 입력층에서는 1D만 입력가능하기에 바꿔준다 28*28 픽셀 사진이니까 input_shape가 저렇게 됨
input_shape는 데이터의 크기를 명시하라는 것이다
- 원래 데이터: 엑셀 표처럼 여러 행과 열로 정리된 데이터.
- Flatten: 표의 데이터를 한 줄로 펴는 것.
엑셀로 생각하자면 이런 느낌인듯
딱 한 줄로 요약: "Flatten은 28x28 이미지를 784개의 숫자로 펼쳐주는 역할을 한다!" 😊
Flatten을 통해 1차원으로 바꿨기 때문에 input_dim을 지정할 필요는 없습니다
Flatten이 입력층으로 작용되었기 때문에 입력층은 없고 relu 활성화 함수를 사용한 두개의 코드줄이 은닉층이다 ,
저 숫자는 내가 맘대로 설정했다..
출력층의 숫자 10은 10개의 숫자를 맞춰야하는거니까 10으로 설정하였다.
활성화함수는 softmax를 사용하였다
softmax가 뭐냐면 ... 어디서 훔쳐 왔는데
Softmax 함수
Softmax 함수는 N가지 출력값을 갖는 함수로써 입력값을 N가지 클래스 중 하나로 분류하는 Multi-class Classification에 주로 사용됩니다. 수식은 아래와 같습니다.
- 출력값이 N개
- 입력값을 각각 지수함수로 취하고, 이를 정규화(=총합을 1로 만듦)
- 정규화로 인해 각 출력값은 0~1 값을 가짐
- 모든 출력값의 합은 반드시 1
- N가지 중 한 가지에 속할 확률 표현 가능(=Multi-class Classification)
이 모델에서는 출력값이 10개이기 때문에 softmax를 쓴 것 같다
챗지피티는 Softmax는 모델의 출력값을 확률로 바꿔주는 함수 라고 말했다
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
이 코드는 딥러닝 모델을 학습할 준비를 완료하는 코드로 세가지를 설정한다
- optimizer (최적화 알고리즘)
- loss (손실 함수)
- metrics (평가 기준)
1. optimizer='adam' (최적화 알고리즘)
모델을 학습시키는 방법을 정하기 adam으로 정함
2.loss='sparse_categorical_crossentropy' (손실 함수)
손실값을 계산해주는 방법을 정하기
여기서는 분류 문제를 풀고 있으니까, sparse_categorical_crossentropy를 사용
정답 레이블이 0, 1, 2...처럼 정수로 되어 있을 때 적합.
3. metrics=['accuracy'] (평가 기준)
- 학습 도중 **모델의 성능(정확도)**을 평가하는 기준
- **accuracy**는 "모델이 얼마나 정답을 맞췄는지"를 퍼센트(%)로 보여
model.fit(x_train, y_train, epochs=10)
- model.fit: 딥러닝 모델을 학습시키는 함수.
- 데이터를 모델에 넣어서 학습을 시작해.
- x_train: 학습용 데이터(입력값).
- 여기서는 숫자 그림 같은 이미지 데이터.
- y_train: 학습용 데이터의 정답(레이블).
- 숫자 그림에 대한 정답(예: 3, 7, 0 등).
- epochs=10: 학습을 10번 반복.
- 모델이 데이터를 처음부터 끝까지 10번 학습한다는 뜻.
test_loss, test_accuracy = model.evaluate(x_test, y_test)
- model.evaluate: 테스트 데이터를 사용해 모델의 **성능(손실 값과 정확도)**을 계산.
- 학습하지 않은 데이터를 사용해서 모델이 얼마나 잘 맞추는지 확인.
- x_test: 테스트 데이터(입력값).
- 여기서는 학습에 사용되지 않은 숫자 그림.
- y_test: 테스트 데이터의 정답(레이블).
- 숫자 그림에 해당하는 실제 정답(예: 5, 3, 7 등).
결과값:
- test_loss: 테스트 데이터에서의 손실 값.
- 모델이 틀린 정도를 나타내는 값. 작을수록 좋음.
- test_accuracy: 테스트 데이터에서의 정확도(%).
- 모델이 정답을 얼마나 잘 맞췄는지 나타냄. 높을수록 좋음.
print(f"테스트 손실: {test_loss:.4f}")
print(f"테스트 정확도: {test_accuracy:.4f}")
predictions = model.predict(x_test)
이 코드는 학습이 끝난 모델이 테스트 데이터를 보고 예측한 결과를 저장하는 명령어
predictions[0]
- predictions: 모델이 테스트 데이터를 보고 예측한 확률 값들이 담긴 배열.
- predictions[0]: 테스트 데이터의 첫 번째 이미지에 대한 예측 결과.
tf.argmax: 배열에서 **가장 큰 값의 인덱스(위치)**를 반환.
ex.
tf.argmax([0.01, 0.02, 0.9, 0.01, 0.03, 0.01, 0.02, 0.0, 0.0, 0.0])
이러면 숫자가 0일 확률 0.01 숫자가 1일 확률 0.02 숫자가 2일 확률 0.9--> 숫자 2
.numpy()**를 사용하면 텐서를 일반적인 숫자(Python 정수)로 바꿔줌
해서 출력 시
첫 번째 이미지의 예측 결과: 7
위에 사진이랑 똑같다 --> 끝
'딥러닝' 카테고리의 다른 글
Keras를 활용한 RNN 모델 구현 (0) | 2025.01.18 |
---|---|
순환 신경망(RNN) 모델 파이썬으로 구현하기 (0) | 2025.01.18 |
Keras로 CNN 구현하기 (0) | 2025.01.15 |
one hot 인코딩 (0) | 2025.01.15 |
이미지 데이터 확인하기 (0) | 2025.01.13 |