본문 바로가기
DNN with Keras/TensorFlow

[TensorFlow] 기본 분류 (이미지 분류) (2)

by goatlab 2022. 6. 15.
728x90
반응형
SMALL

모델 구성

 

신경망 모델을 만들려면 모델의 층을 구성한 다음 모델을 컴파일한다.

 

층 설정

 

신경망의 기본 빌딩 블록은 레이어이다. 레이어는 레이어에 공급된 데이터로부터 표현을 추출한다. 이러한 표현은 당면한 문제에 의미가 있어야 한다.

 

대부분 딥러닝은 간단한 층을 연결하여 구성된다. tf.keras.layers.Dense와 같은 층들의 가중치 (parameter)는 훈련하는 동안 학습된다.

 
model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10)
])

 

이 네트워크의 첫 번째 층인 tf.keras.layers.Flatten은 2차원 배열 (28 x 28 픽셀)의 이미지 포맷을 28 * 28 = 784 픽셀의 1차원 배열로 변환한다. 이 층은 이미지에 있는 픽셀의 행을 펼쳐서 일렬로 늘린다. 이 층에는 학습되는 가중치가 없고 데이터를 변환하기만 한다.

 

픽셀을 펼친 후에는 두 개의 tf.keras.layers.Dense 층이 연속되어 연결된다. 이 층을 밀집 연결 (densely-connected) 또는 완전 연결 (fully-connected) 층이라고 부른다. 첫 번째 Dense 층은 128개의 노드 (또는 뉴런)를 가진다. 두 번째 (마지막) 층은 10개의 노드의 소프트맥스 (softmax) 층이다. 이 층은 10개의 확률을 반환하고 반환된 값의 전체 합은 1이다. 각 노드는 현재 이미지가 10개 클래스 중 하나에 속할 확률을 출력한다.

 

모델 컴파일

 

모델을 훈련할 준비가 되기 전에 몇 가지 설정이 더 필요하다. 다음은 모델의 컴파일 단계에서 추가된다.

 

  • 손실 함수 : 훈련 중 모델이 얼마나 정확한지 측정한다. 모델을 올바른 방향으로 "조정"하려면 이 함수를 최소화해야 한다.

  • 옵티마이저 : 모델이 인식하는 데이터와 해당 손실 함수를 기반으로 모델이 업데이트되는 방식이다.

  • 메트릭 : 훈련 및 테스트 단계를 모니터링하는 데 사용된다. 다음 예에서는 올바르게 분류된 이미지의 비율인 정확도를 사용한다.
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

 

모델 훈련

 

신경망 모델을 훈련하려면 다음 단계가 필요하다.

 

  1. 훈련 데이터를 모델에 주입한다. 이 예에서는 train_images와 train_labels 배열이다.

  2. 모델이 이미지와 레이블을 매핑하는 방법을 배운다.

  3. 테스트 세트에 대한 모델의 예측을 만듭니다-이 예에서는 test_images 배열이다. 이 예측이 test_labels 배열의 레이블과 맞는지 확인한다.

  4. 예측이 test_labels 배열의 레이블과 일치하는지 확인한다.

 

모델 피드

 

훈련을 시작하려면 model.fit 메서드를 호출한다. 모델을 훈련 데이터에 "맞추기 (fit)" 때문에 이렇게 불린다.

 
model.fit(train_images, train_labels, epochs=10)
Epoch 1/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.4989 - accuracy: 0.8247
Epoch 2/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3724 - accuracy: 0.8668
Epoch 3/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3333 - accuracy: 0.8786
Epoch 4/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.3104 - accuracy: 0.8855
Epoch 5/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2919 - accuracy: 0.8911
Epoch 6/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2779 - accuracy: 0.8978
Epoch 7/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2646 - accuracy: 0.9011
Epoch 8/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2561 - accuracy: 0.9042
Epoch 9/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2454 - accuracy: 0.9092
Epoch 10/10
1875/1875 [==============================] - 3s 1ms/step - loss: 0.2388 - accuracy: 0.9108
<keras.callbacks.History at 0x7f1d1670c150>

 

모델이 훈련되면서 손실과 정확도 지표가 출력된다. 이 모델은 훈련 세트에서 약 0.88 (88%) 정도의 정확도를 달성한다.

 

정확도 평가

 

다음으로, 모델이 테스트 데이터세트에서 작동하는 방식을 비교한다.

 
test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

print('\nTest accuracy:', test_acc)
313/313 - 0s - loss: 0.3301 - accuracy: 0.8830

Test accuracy: 0.8830000162124634

 

테스트 세트의 정확도가 훈련 세트의 정확도보다 조금 낮다. 훈련 세트의 정확도와 테스트 세트의 정확도 사이의 차이는 과대적합 (overfitting) 때문이다. 과대적합은 머신러닝 모델이 훈련 데이터보다 새로운 데이터에서 성능이 낮아지는 현상을 말한다.

 

 

예측하기

 

훈련된 모델을 사용하여 일부 이미지에 대한 예측을 수행할 수 있다. 모델의 선형 출력, 로짓, 소프트맥스 레이어를 연결하여 로짓을 해석하기 쉬운 확률로 변환한다.

 
probability_model = tf.keras.Sequential([model, 
                                         tf.keras.layers.Softmax()])
predictions = probability_model.predict(test_images)

 

여기서는 테스트 세트에 있는 각 이미지의 레이블을 예측했다. 첫 번째 예측을 확인한다.

 
predictions[0]
array([9.2266013e-08, 4.1849513e-11, 4.7670059e-09, 5.2083129e-12,
       1.2833117e-08, 1.8356493e-03, 3.5984229e-08, 1.1907237e-02,
       2.9079965e-07, 9.8625678e-01], dtype=float32)

 

이 예측은 10개의 숫자 배열로 나타난다. 이 값은 10개의 옷 품목에 상응하는 모델의 신뢰도 (confidence)를 나타낸다. 가장 높은 신뢰도를 가진 레이블을 찾는다.

 
np.argmax(predictions[0])
9

 

모델은 이 이미지가 앵클 부츠 (class_name[9])라고 가장 확신하고 있다. 이 값이 맞는지 테스트 레이블을 확인한다.

 
test_labels[0]
9

 

10개 클래스에 대한 예측을 모두 그래프로 표현한다.

 
def plot_image(i, predictions_array, true_label, img):
  true_label, img = true_label[i], img[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])

  plt.imshow(img, cmap=plt.cm.binary)

  predicted_label = np.argmax(predictions_array)
  if predicted_label == true_label:
    color = 'blue'
  else:
    color = 'red'

  plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
                                100*np.max(predictions_array),
                                class_names[true_label]),
                                color=color)

def plot_value_array(i, predictions_array, true_label):
  true_label = true_label[i]
  plt.grid(False)
  plt.xticks(range(10))
  plt.yticks([])
  thisplot = plt.bar(range(10), predictions_array, color="#777777")
  plt.ylim([0, 1])
  predicted_label = np.argmax(predictions_array)

  thisplot[predicted_label].set_color('red')
  thisplot[true_label].set_color('blue')

 

예측 확인

 

훈련된 모델을 사용하여 일부 이미지에 대한 예측을 수행할 수 있다. 0번째 원소의 이미지, 예측, 신뢰도 점수 배열을 확인한다.

 
i = 0
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions[i], test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions[i],  test_labels)
plt.show()

i = 12
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions[i], test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions[i],  test_labels)
plt.show()

 

몇 개의 이미지의 예측을 출력한다. 올바르게 예측된 레이블은 파란색이고 잘못 예측된 레이블은 빨강색이다. 숫자는 예측 레이블의 신뢰도 퍼센트 (100점 만점)이다. 신뢰도 점수가 높을 때도 잘못 예측할 수 있다.

 
# Plot the first X test images, their predicted labels, and the true labels.
# Color correct predictions in blue and incorrect predictions in red.
num_rows = 5
num_cols = 3
num_images = num_rows*num_cols
plt.figure(figsize=(2*2*num_cols, 2*num_rows))
for i in range(num_images):
  plt.subplot(num_rows, 2*num_cols, 2*i+1)
  plot_image(i, predictions[i], test_labels, test_images)
  plt.subplot(num_rows, 2*num_cols, 2*i+2)
  plot_value_array(i, predictions[i], test_labels)
plt.tight_layout()
plt.show()

 

훈련된 모델 사용하기

 

마지막으로 훈련된 모델을 사용하여 한 이미지에 대한 예측을 만든다.

 
# Grab an image from the test dataset.
img = test_images[1]

print(img.shape)
(28, 28)

 

tf.keras 모델은 한 번에 샘플의 묶음 또는 배치 (batch)로 예측을 만드는데 최적화되어 있다. 하나의 이미지를 사용할 때에도 2차원 배열로 만들어야 한다.

 
# Add the image to a batch where it's the only member.
img = (np.expand_dims(img,0))

print(img.shape)
(1, 28, 28)

 

이제 이 이미지의 예측을 만든다.

 
predictions_single = probability_model.predict(img)

print(predictions_single)
[[3.6173755e-05 3.2209617e-14 9.9866760e-01 1.6559891e-11 1.0769934e-03
  1.6140698e-13 2.1918291e-04 3.4505306e-21 3.6745976e-10 1.0840150e-14]]
plot_value_array(1, predictions_single[0], test_labels)
_ = plt.xticks(range(10), class_names, rotation=45)
plt.show()

 

tf.keras.Model.predict는 데이터 배치의 각 이미지에 대해 하나의 목록씩 목록의 목록을 반환한다. 배치에서 (유일한) 이미지에 대한 예측을 가져온다.

 
np.argmax(predictions_single[0])
2

 

https://www.tensorflow.org/tutorials/keras/classification?hl=ko#%EB%AA%A8%EB%8D%B8_%EA%B5%AC%EC%84%B1 

 

기본 분류: 의류 이미지 분류  |  TensorFlow Core

Google I/O는 끝입니다! TensorFlow 세션 확인하기 세션 보기 기본 분류: 의류 이미지 분류 이 튜토리얼에서는 운동화나 셔츠 같은 옷 이미지를 분류하는 신경망 모델을 훈련합니다. 상세 내용을 모두

www.tensorflow.org

 

728x90
반응형
LIST