텐서플로 허브와 전이학습

View on TensorFlow.org Run in Google Colab View source on GitHub Download notebook

텐서플로 허브텐서플로 허브는 이 전에 학습된 모델들의 요소들을 공유하는 하나의 방법입니다. 학습된 모델들의 검색가능한 리스트에 대한 텐서플로 모듈 허브를 보세요. 이 튜토리얼은 입증합니다:

  1. tf.keras로 텐서플로 허브를 사용하는 방법.
  2. 텐서플로 허브를 사용하여 이미지 분류를 하는 방법.
  3. 간단한 전이학습을 하는 방법.

설치하기

import matplotlib.pylab as plt

import tensorflow as tf
!pip install -q -U tf-hub-nightly
import tensorflow_hub as hub

from tensorflow.keras import layers

ImageNet 분류기

분류기 다운로드하기

이동 네트워크 컴퓨터를 로드하기 위해 hub.module을, 그리고 하나의 keras층으로 감싸기 위해 tf.keras.layers.Lambda를 사용하세요. Fthub.dev의 텐서플로2.0 버전의 양립 가능한 이미지 분류기 URL 는 이곳에서 작동할 것입니다.

classifier_url ="https://tfhub.dev/google/tf2-preview/mobilenet_v2/classification/2"
IMAGE_SHAPE = (224, 224)

classifier = tf.keras.Sequential([
    hub.KerasLayer(classifier_url, input_shape=IMAGE_SHAPE+(3,))
])

싱글 이미지 실행시키기

모델을 시도하기 위해 싱글 이미지를 다운로드하세요.

import numpy as np
import PIL.Image as Image

grace_hopper = tf.keras.utils.get_file('image.jpg','https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg')
grace_hopper = Image.open(grace_hopper).resize(IMAGE_SHAPE)
grace_hopper
Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg

 8192/61306 [===>..........................] - ETA: 0s
65536/61306 [================================] - 0s 0us/step

png

grace_hopper = np.array(grace_hopper)/255.0
grace_hopper.shape
(224, 224, 3)

차원 배치를 추가하세요, 그리고 이미지를 모델에 통과시키세요.

result = classifier.predict(grace_hopper[np.newaxis, ...])
result.shape
(1, 1001)

그 결과는 로지트의 1001 요소 벡터입니다. 이는 이미지에 대한 각각의 클래스 확률을 계산합니다.

그래서 탑 클래스인 ID는 최대값을 알 수 있습니다:

predicted_class = np.argmax(result[0], axis=-1)
predicted_class
653

예측 해독하기

우리는 클래스 ID를 예측하고, ImageNet라벨을 불러오고, 그리고 예측을 해독합니다.

labels_path = tf.keras.utils.get_file('ImageNetLabels.txt','https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt')
imagenet_labels = np.array(open(labels_path).read().splitlines())
plt.imshow(grace_hopper)
plt.axis('off')
predicted_class_name = imagenet_labels[predicted_class]
_ = plt.title("Prediction: " + predicted_class_name.title())

png

간단한 전이 학습

텐서플로 허브를 사용함으로써, 우리의 데이터셋에 있는 클래스들을 인지하기 위해 모델의 최상위 층을 재학습 시키는 것이 쉬워졌습니다.

데이터셋

이 예제를 해결하기 위해, 텐서플로의 flowers 데이터셋을 사용할 것입니다:

data_root = tf.keras.utils.get_file(
  'flower_photos','https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
   untar=True)
Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz

     8192/228813984 [..............................] - ETA: 3s
8396800/228813984 [>.............................] - ETA: 1s
21708800/228813984 [=>............................] - ETA: 1s
35356672/228813984 [===>..........................] - ETA: 0s
49086464/228813984 [=====>........................] - ETA: 0s
58728448/228813984 [======>.......................] - ETA: 1s
72015872/228813984 [========>.....................] - ETA: 1s
85901312/228813984 [==========>...................] - ETA: 1s
92880896/228813984 [===========>..................] - ETA: 1s
100671488/228813984 [============>.................] - ETA: 1s
113917952/228813984 [=============>................] - ETA: 1s
127598592/228813984 [===============>..............] - ETA: 0s
141213696/228813984 [=================>............] - ETA: 0s
154714112/228813984 [===================>..........] - ETA: 0s
168271872/228813984 [=====================>........] - ETA: 0s
181329920/228813984 [======================>.......] - ETA: 0s

194453504/228813984 [========================>.....] - ETA: 0s
207446016/228813984 [==========================>...] - ETA: 0s
220774400/228813984 [===========================>..] - ETA: 0s
228818944/228813984 [==============================] - 2s 0us/step

우리의 모델에 이 데이터를 가장 간단하게 로딩 하는 방법은 tf.keras.preprocessing.image.image.ImageDataGenerator를 사용하는 것이고,

모든 텐서플로 허브의 이미지 모듈들은 0과 1사이의 상수들의 입력을 기대합니다. 이를 만족 시키기 위해 ImageDataGenerator의 rescale인자를 사용하세요.

그 이미지의 사이즈는 나중에 다뤄질 것입니다.

image_generator = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1/255)
image_data = image_generator.flow_from_directory(str(data_root), target_size=IMAGE_SHAPE)
Found 3670 images belonging to 5 classes.

결과로 나온 오브젝트는 image_batch와 label_batch를 같이 리턴 하는 반복자입니다.

for image_batch, label_batch in image_data:
  print("Image batch shape: ", image_batch.shape)
  print("Label batch shape: ", label_batch.shape)
  break
Image batch shape:  (32, 224, 224, 3)
Label batch shape:  (32, 5)

이미지 배치에 대한 분류기를 실행해보자

이제 이미지 배치에 대한 분류기를 실행해봅시다.

result_batch = classifier.predict(image_batch)
result_batch.shape
(32, 1001)
predicted_class_names = imagenet_labels[np.argmax(result_batch, axis=-1)]
predicted_class_names
array(['daisy', 'daisy', 'balloon', 'bee', 'coil', 'quill', 'pot', 'wool',
       'daisy', 'picket fence', 'hip', 'picket fence', 'mushroom',
       'daisy', 'cardoon', 'picket fence', 'daisy', 'plow',
       'picket fence', 'daisy', 'daisy', 'cardoon', 'bee', 'leafhopper',
       'daisy', 'rapeseed', 'ant', 'daisy', 'sea urchin', 'hip', 'hip',
       'daisy'], dtype='<U30')

얼마나 많은 예측들이 이미지에 맞는지 검토해봅시다:

plt.figure(figsize=(10,9))
plt.subplots_adjust(hspace=0.5)
for n in range(30):
  plt.subplot(6,5,n+1)
  plt.imshow(image_batch[n])
  plt.title(predicted_class_names[n])
  plt.axis('off')
_ = plt.suptitle("ImageNet predictions")

png

이미지 속성을 가진 LICENSE.txt 파일을 보세요.

결과가 완벽과는 거리가 멀지만, 모델이 ("daisy"를 제외한) 모든 것을 대비해서 학습된 클래스가 아니라는 것을 고려하면 합리적입니다.

헤드리스 모델을 다운로드하세요

텐서플로 허브는 맨 위 분류층이 없어도 모델을 분배 시킬 수 있습니다. 이는 전이 학습을 쉽게 할 수 있게 만들었습니다.

fthub.dev의 텐서플로 2.0버전의 양립 가능한 이미지 특성 벡터 URL 은 모두 이 곳에서 작동할 것입니다.

feature_extractor_url = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/2"

특성 추출기를 만들어봅시다.

feature_extractor_layer = hub.KerasLayer(feature_extractor_url,
                                         input_shape=(224,224,3))

이 것은 각각의 이미지마다 길이가 1280인 벡터가 반환됩니다:

feature_batch = feature_extractor_layer(image_batch)
print(feature_batch.shape)
(32, 1280)

특성 추출기 계층에 있는 변수들을 굳히면, 학습은 오직 새로운 분류 계층만 변경시킬 수 있습니다.

feature_extractor_layer.trainable = False

분류 head를 붙이세요.

이제 tf.keras.Sequential 모델에 있는 허브 계층을 포장하고, 새로운 분류 계층을 추가하세요.

model = tf.keras.Sequential([
  feature_extractor_layer,
  layers.Dense(image_data.num_classes, activation='softmax')
])

model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
keras_layer_1 (KerasLayer)   (None, 1280)              2257984   
_________________________________________________________________
dense (Dense)                (None, 5)                 6405      
=================================================================
Total params: 2,264,389
Trainable params: 6,405
Non-trainable params: 2,257,984
_________________________________________________________________
predictions = model(image_batch)
predictions.shape
TensorShape([32, 5])

모델을 학습시키세요

학습 과정 환경을 설정하기 위해 컴파일을 사용하세요:

model.compile(
  optimizer=tf.keras.optimizers.Adam(),
  loss='categorical_crossentropy',
  metrics=['acc'])

이제 모델을 학습시키기 위해 .fit방법을 사용하세요.

예제를 짧게 유지시키기 위해 오로지 2세대만 학습시키세요. 학습 과정을 시각화하기 위해서, 맞춤형 회신을 사용하면 손실과, 세대 평균이 아닌 배치 개별의 정확도를 기록할 수 있습니다.

class CollectBatchStats(tf.keras.callbacks.Callback):
  def __init__(self):
    self.batch_losses = []
    self.batch_acc = []

  def on_train_batch_end(self, batch, logs=None):
    self.batch_losses.append(logs['loss'])
    self.batch_acc.append(logs['acc'])
    self.model.reset_metrics()
steps_per_epoch = np.ceil(image_data.samples/image_data.batch_size)

batch_stats_callback = CollectBatchStats()

history = model.fit_generator(image_data, epochs=2,
                              steps_per_epoch=steps_per_epoch,
                              callbacks = [batch_stats_callback])
WARNING:tensorflow:From <ipython-input-1-dd38f4e8ca03>:7: Model.fit_generator (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
Please use Model.fit, which supports generators.
WARNING:tensorflow:From <ipython-input-1-dd38f4e8ca03>:7: Model.fit_generator (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
Please use Model.fit, which supports generators.
Epoch 1/2
1/115 [..............................] - ETA: 0s - loss: 1.5888 - acc: 0.2812
2/115 [..............................] - ETA: 5s - loss: 1.6566 - acc: 0.2812
3/115 [..............................] - ETA: 8s - loss: 1.5174 - acc: 0.3125
4/115 [>.............................] - ETA: 8s - loss: 1.6039 - acc: 0.2812
5/115 [>.............................] - ETA: 8s - loss: 1.3052 - acc: 0.4688
6/115 [>.............................] - ETA: 9s - loss: 1.5447 - acc: 0.4062
7/115 [>.............................] - ETA: 9s - loss: 1.2212 - acc: 0.5312
8/115 [=>............................] - ETA: 9s - loss: 1.4022 - acc: 0.4375
9/115 [=>............................] - ETA: 9s - loss: 1.2217 - acc: 0.5000
10/115 [=>............................] - ETA: 10s - loss: 1.0053 - acc: 0.6250
11/115 [=>............................] - ETA: 10s - loss: 1.0474 - acc: 0.7188
12/115 [==>...........................] - ETA: 10s - loss: 0.9216 - acc: 0.6875
13/115 [==>...........................] - ETA: 9s - loss: 1.0666 - acc: 0.6250
14/115 [==>...........................] - ETA: 9s - loss: 0.8901 - acc: 0.6562
15/115 [==>...........................] - ETA: 10s - loss: 0.9304 - acc: 0.6364
17/115 [===>..........................] - ETA: 9s - loss: 0.9196 - acc: 0.7812
18/115 [===>..........................] - ETA: 9s - loss: 0.9338 - acc: 0.6250
19/115 [===>..........................] - ETA: 9s - loss: 0.9368 - acc: 0.7188
20/115 [====>.........................] - ETA: 9s - loss: 0.8217 - acc: 0.7188
21/115 [====>.........................] - ETA: 9s - loss: 0.8326 - acc: 0.6875
22/115 [====>.........................] - ETA: 9s - loss: 1.1156 - acc: 0.6562
23/115 [=====>........................] - ETA: 9s - loss: 0.7869 - acc: 0.7500
24/115 [=====>........................] - ETA: 9s - loss: 0.6473 - acc: 0.8125
25/115 [=====>........................] - ETA: 9s - loss: 0.7519 - acc: 0.7812
26/115 [=====>........................] - ETA: 9s - loss: 0.5517 - acc: 0.8438
27/115 [======>.......................] - ETA: 8s - loss: 0.5719 - acc: 0.8125
28/115 [======>.......................] - ETA: 8s - loss: 0.8510 - acc: 0.6875
29/115 [======>.......................] - ETA: 8s - loss: 0.6558 - acc: 0.7188
30/115 [======>.......................] - ETA: 8s - loss: 0.8063 - acc: 0.7188
31/115 [=======>......................] - ETA: 8s - loss: 0.6016 - acc: 0.7812
32/115 [=======>......................] - ETA: 8s - loss: 0.9822 - acc: 0.6562
33/115 [=======>......................] - ETA: 8s - loss: 0.5605 - acc: 0.8438
34/115 [=======>......................] - ETA: 8s - loss: 0.7676 - acc: 0.6875
35/115 [========>.....................] - ETA: 8s - loss: 0.4568 - acc: 0.8125
36/115 [========>.....................] - ETA: 8s - loss: 0.7704 - acc: 0.6562
37/115 [========>.....................] - ETA: 8s - loss: 0.7566 - acc: 0.7812
38/115 [========>.....................] - ETA: 7s - loss: 0.7443 - acc: 0.7500
39/115 [=========>....................] - ETA: 7s - loss: 0.4131 - acc: 0.9062
40/115 [=========>....................] - ETA: 7s - loss: 0.6848 - acc: 0.7812
41/115 [=========>....................] - ETA: 7s - loss: 0.6862 - acc: 0.8125
42/115 [=========>....................] - ETA: 7s - loss: 0.4757 - acc: 0.8438
43/115 [==========>...................] - ETA: 7s - loss: 0.5558 - acc: 0.7500
44/115 [==========>...................] - ETA: 7s - loss: 0.6013 - acc: 0.7812
45/115 [==========>...................] - ETA: 7s - loss: 0.6081 - acc: 0.7812
46/115 [===========>..................] - ETA: 7s - loss: 0.4702 - acc: 0.9062
47/115 [===========>..................] - ETA: 6s - loss: 0.8671 - acc: 0.6875
48/115 [===========>..................] - ETA: 6s - loss: 0.7367 - acc: 0.7812
49/115 [===========>..................] - ETA: 6s - loss: 0.4427 - acc: 0.8750
50/115 [============>.................] - ETA: 6s - loss: 0.5083 - acc: 0.8125
51/115 [============>.................] - ETA: 6s - loss: 0.5533 - acc: 0.8438
52/115 [============>.................] - ETA: 6s - loss: 0.6762 - acc: 0.7500
53/115 [============>.................] - ETA: 6s - loss: 0.7023 - acc: 0.7188
54/115 [=============>................] - ETA: 6s - loss: 0.5023 - acc: 0.8438
55/115 [=============>................] - ETA: 6s - loss: 0.4477 - acc: 0.8750
56/115 [=============>................] - ETA: 6s - loss: 0.5927 - acc: 0.7500
57/115 [=============>................] - ETA: 5s - loss: 0.5439 - acc: 0.7500
58/115 [==============>...............] - ETA: 5s - loss: 0.5084 - acc: 0.8125
59/115 [==============>...............] - ETA: 5s - loss: 0.4072 - acc: 0.8750
60/115 [==============>...............] - ETA: 5s - loss: 0.3780 - acc: 0.9375
61/115 [==============>...............] - ETA: 5s - loss: 0.5374 - acc: 0.8125
62/115 [===============>..............] - ETA: 5s - loss: 0.4315 - acc: 0.8438
63/115 [===============>..............] - ETA: 5s - loss: 0.4059 - acc: 0.8750
64/115 [===============>..............] - ETA: 5s - loss: 0.5072 - acc: 0.8750
65/115 [===============>..............] - ETA: 5s - loss: 0.3024 - acc: 0.9375
66/115 [================>.............] - ETA: 5s - loss: 0.4725 - acc: 0.7812
67/115 [================>.............] - ETA: 4s - loss: 0.4465 - acc: 0.8438
68/115 [================>.............] - ETA: 4s - loss: 0.5738 - acc: 0.7500
69/115 [=================>............] - ETA: 4s - loss: 0.6317 - acc: 0.7500
70/115 [=================>............] - ETA: 4s - loss: 0.4979 - acc: 0.8125
71/115 [=================>............] - ETA: 4s - loss: 0.5708 - acc: 0.7812
72/115 [=================>............] - ETA: 4s - loss: 0.2840 - acc: 0.9062
73/115 [==================>...........] - ETA: 4s - loss: 0.5076 - acc: 0.8125
74/115 [==================>...........] - ETA: 4s - loss: 0.4375 - acc: 0.9062
75/115 [==================>...........] - ETA: 4s - loss: 0.2865 - acc: 0.9375
76/115 [==================>...........] - ETA: 3s - loss: 0.4595 - acc: 0.8750
77/115 [===================>..........] - ETA: 3s - loss: 0.8177 - acc: 0.6250
78/115 [===================>..........] - ETA: 3s - loss: 0.5543 - acc: 0.7812
79/115 [===================>..........] - ETA: 3s - loss: 0.3464 - acc: 0.9062
80/115 [===================>..........] - ETA: 3s - loss: 0.6228 - acc: 0.8125
81/115 [====================>.........] - ETA: 3s - loss: 0.4147 - acc: 0.8125
82/115 [====================>.........] - ETA: 3s - loss: 0.2797 - acc: 0.9688
83/115 [====================>.........] - ETA: 3s - loss: 0.4436 - acc: 0.8750
84/115 [====================>.........] - ETA: 3s - loss: 0.4992 - acc: 0.7500
85/115 [=====================>........] - ETA: 3s - loss: 0.5405 - acc: 0.7812
86/115 [=====================>........] - ETA: 2s - loss: 0.4120 - acc: 0.9062
87/115 [=====================>........] - ETA: 2s - loss: 0.5473 - acc: 0.7500
88/115 [=====================>........] - ETA: 2s - loss: 0.3836 - acc: 0.9062
89/115 [======================>.......] - ETA: 2s - loss: 0.4841 - acc: 0.9062
90/115 [======================>.......] - ETA: 2s - loss: 0.3144 - acc: 0.8750
91/115 [======================>.......] - ETA: 2s - loss: 0.5886 - acc: 0.8125
92/115 [=======================>......] - ETA: 2s - loss: 0.5616 - acc: 0.8125
93/115 [=======================>......] - ETA: 2s - loss: 0.4443 - acc: 0.8438
94/115 [=======================>......] - ETA: 2s - loss: 0.6253 - acc: 0.7500
95/115 [=======================>......] - ETA: 2s - loss: 0.2589 - acc: 0.9062
96/115 [========================>.....] - ETA: 1s - loss: 0.4875 - acc: 0.8750
97/115 [========================>.....] - ETA: 1s - loss: 0.2638 - acc: 0.9375
98/115 [========================>.....] - ETA: 1s - loss: 0.3965 - acc: 0.8750
99/115 [========================>.....] - ETA: 1s - loss: 0.4013 - acc: 0.8750
100/115 [=========================>....] - ETA: 1s - loss: 0.4952 - acc: 0.8438
101/115 [=========================>....] - ETA: 1s - loss: 0.3903 - acc: 0.8438
102/115 [=========================>....] - ETA: 1s - loss: 0.2742 - acc: 0.9375
103/115 [=========================>....] - ETA: 1s - loss: 0.5089 - acc: 0.8125
104/115 [==========================>...] - ETA: 1s - loss: 0.3136 - acc: 0.8750
105/115 [==========================>...] - ETA: 1s - loss: 0.3657 - acc: 0.8438
106/115 [==========================>...] - ETA: 0s - loss: 0.7158 - acc: 0.6875
107/115 [==========================>...] - ETA: 0s - loss: 0.4748 - acc: 0.9062
108/115 [===========================>..] - ETA: 0s - loss: 0.3082 - acc: 0.9375
109/115 [===========================>..] - ETA: 0s - loss: 0.5193 - acc: 0.8125
110/115 [===========================>..] - ETA: 0s - loss: 0.5120 - acc: 0.8125
111/115 [===========================>..] - ETA: 0s - loss: 0.3434 - acc: 0.9375
112/115 [============================>.] - ETA: 0s - loss: 0.3177 - acc: 0.8750
113/115 [============================>.] - ETA: 0s - loss: 0.3298 - acc: 0.9062
114/115 [============================>.] - ETA: 0s - loss: 0.2866 - acc: 0.9062
115/115 [==============================] - ETA: 0s - loss: 0.4199 - acc: 0.8750
115/115 [==============================] - 12s 103ms/step - loss: 0.4199 - acc: 0.8750
Epoch 2/2
1/115 [..............................] - ETA: 0s - loss: 0.4218 - acc: 0.9062
2/115 [..............................] - ETA: 5s - loss: 0.3928 - acc: 0.8750
3/115 [..............................] - ETA: 7s - loss: 0.3997 - acc: 0.8438
4/115 [>.............................] - ETA: 7s - loss: 0.3281 - acc: 0.9062
5/115 [>.............................] - ETA: 8s - loss: 0.3660 - acc: 0.8750
6/115 [>.............................] - ETA: 9s - loss: 0.3725 - acc: 0.8750
7/115 [>.............................] - ETA: 9s - loss: 0.4199 - acc: 0.8125
8/115 [=>............................] - ETA: 9s - loss: 0.4798 - acc: 0.8750
9/115 [=>............................] - ETA: 10s - loss: 0.4998 - acc: 0.8438
10/115 [=>............................] - ETA: 9s - loss: 0.3846 - acc: 0.8750
11/115 [=>............................] - ETA: 9s - loss: 0.3615 - acc: 0.8750
12/115 [==>...........................] - ETA: 9s - loss: 0.4118 - acc: 0.8438
13/115 [==>...........................] - ETA: 9s - loss: 0.4767 - acc: 0.8125
14/115 [==>...........................] - ETA: 9s - loss: 0.2450 - acc: 0.9375
15/115 [==>...........................] - ETA: 9s - loss: 0.4463 - acc: 0.7188
16/115 [===>..........................] - ETA: 9s - loss: 0.2472 - acc: 0.9062
17/115 [===>..........................] - ETA: 9s - loss: 0.2696 - acc: 0.9062
18/115 [===>..........................] - ETA: 9s - loss: 0.3747 - acc: 0.8750
19/115 [===>..........................] - ETA: 9s - loss: 0.2098 - acc: 1.0000
20/115 [====>.........................] - ETA: 9s - loss: 0.5091 - acc: 0.8125
21/115 [====>.........................] - ETA: 9s - loss: 0.5652 - acc: 0.8438
22/115 [====>.........................] - ETA: 9s - loss: 0.4508 - acc: 0.8125
23/115 [=====>........................] - ETA: 9s - loss: 0.2183 - acc: 0.9688
24/115 [=====>........................] - ETA: 9s - loss: 0.3691 - acc: 0.9062
25/115 [=====>........................] - ETA: 8s - loss: 0.5733 - acc: 0.8438
26/115 [=====>........................] - ETA: 8s - loss: 0.3073 - acc: 0.8750
27/115 [======>.......................] - ETA: 8s - loss: 0.3493 - acc: 0.8750
28/115 [======>.......................] - ETA: 8s - loss: 0.2207 - acc: 0.9375
29/115 [======>.......................] - ETA: 8s - loss: 0.2111 - acc: 0.9062
30/115 [======>.......................] - ETA: 8s - loss: 0.2752 - acc: 0.8750
31/115 [=======>......................] - ETA: 8s - loss: 0.1359 - acc: 1.0000
32/115 [=======>......................] - ETA: 8s - loss: 0.1943 - acc: 0.9375
33/115 [=======>......................] - ETA: 8s - loss: 0.2564 - acc: 0.9688
34/115 [=======>......................] - ETA: 8s - loss: 0.3211 - acc: 0.8750
35/115 [========>.....................] - ETA: 8s - loss: 0.2128 - acc: 0.9375
36/115 [========>.....................] - ETA: 7s - loss: 0.2780 - acc: 0.9062
37/115 [========>.....................] - ETA: 7s - loss: 0.2240 - acc: 0.9062
38/115 [========>.....................] - ETA: 7s - loss: 0.3678 - acc: 0.8750
39/115 [=========>....................] - ETA: 7s - loss: 0.2688 - acc: 0.9062
40/115 [=========>....................] - ETA: 7s - loss: 0.3988 - acc: 0.8438
41/115 [=========>....................] - ETA: 7s - loss: 0.2907 - acc: 0.9062
42/115 [=========>....................] - ETA: 7s - loss: 0.4515 - acc: 0.8750
43/115 [==========>...................] - ETA: 7s - loss: 0.3035 - acc: 0.9062
44/115 [==========>...................] - ETA: 7s - loss: 0.3699 - acc: 0.9062
45/115 [==========>...................] - ETA: 7s - loss: 0.2371 - acc: 0.9375
46/115 [===========>..................] - ETA: 7s - loss: 0.3313 - acc: 0.8750
47/115 [===========>..................] - ETA: 7s - loss: 0.4728 - acc: 0.8750
48/115 [===========>..................] - ETA: 6s - loss: 0.3425 - acc: 0.9062
49/115 [===========>..................] - ETA: 6s - loss: 0.3004 - acc: 0.9375
50/115 [============>.................] - ETA: 6s - loss: 0.1981 - acc: 0.9688
51/115 [============>.................] - ETA: 6s - loss: 0.2314 - acc: 0.9375
52/115 [============>.................] - ETA: 6s - loss: 0.3597 - acc: 0.9062
53/115 [============>.................] - ETA: 6s - loss: 0.1753 - acc: 0.9688
54/115 [=============>................] - ETA: 6s - loss: 0.6279 - acc: 0.7812
55/115 [=============>................] - ETA: 6s - loss: 0.3011 - acc: 0.9375
56/115 [=============>................] - ETA: 6s - loss: 0.2411 - acc: 0.8636
57/115 [=============>................] - ETA: 6s - loss: 0.4001 - acc: 0.8438
58/115 [==============>...............] - ETA: 5s - loss: 0.2137 - acc: 0.9688
59/115 [==============>...............] - ETA: 5s - loss: 0.4087 - acc: 0.8750
60/115 [==============>...............] - ETA: 5s - loss: 0.3695 - acc: 0.8125
61/115 [==============>...............] - ETA: 5s - loss: 0.2220 - acc: 0.9062
62/115 [===============>..............] - ETA: 5s - loss: 0.3873 - acc: 0.8438
63/115 [===============>..............] - ETA: 5s - loss: 0.2252 - acc: 0.9375
64/115 [===============>..............] - ETA: 5s - loss: 0.3874 - acc: 0.9062
65/115 [===============>..............] - ETA: 5s - loss: 0.4422 - acc: 0.8750
66/115 [================>.............] - ETA: 5s - loss: 0.4382 - acc: 0.8125
67/115 [================>.............] - ETA: 4s - loss: 0.2263 - acc: 0.9375
68/115 [================>.............] - ETA: 4s - loss: 0.1549 - acc: 1.0000
69/115 [=================>............] - ETA: 4s - loss: 0.2557 - acc: 0.9062
70/115 [=================>............] - ETA: 4s - loss: 0.2589 - acc: 0.9688
71/115 [=================>............] - ETA: 4s - loss: 0.2921 - acc: 0.9375
72/115 [=================>............] - ETA: 4s - loss: 0.2508 - acc: 0.9375
73/115 [==================>...........] - ETA: 4s - loss: 0.4542 - acc: 0.8438
74/115 [==================>...........] - ETA: 4s - loss: 0.3690 - acc: 0.8438
75/115 [==================>...........] - ETA: 4s - loss: 0.3621 - acc: 0.8438
76/115 [==================>...........] - ETA: 4s - loss: 0.5199 - acc: 0.8438
77/115 [===================>..........] - ETA: 3s - loss: 0.2255 - acc: 0.9688
78/115 [===================>..........] - ETA: 3s - loss: 0.6634 - acc: 0.7812
79/115 [===================>..........] - ETA: 3s - loss: 0.2569 - acc: 0.9375
80/115 [===================>..........] - ETA: 3s - loss: 0.3121 - acc: 0.9062
81/115 [====================>.........] - ETA: 3s - loss: 0.3622 - acc: 0.8438
82/115 [====================>.........] - ETA: 3s - loss: 0.1980 - acc: 0.9375
83/115 [====================>.........] - ETA: 3s - loss: 0.5331 - acc: 0.7500
84/115 [====================>.........] - ETA: 3s - loss: 0.3185 - acc: 0.9375
85/115 [=====================>........] - ETA: 3s - loss: 0.2814 - acc: 0.9062
86/115 [=====================>........] - ETA: 2s - loss: 0.6582 - acc: 0.7812
87/115 [=====================>........] - ETA: 2s - loss: 0.3024 - acc: 0.9062
88/115 [=====================>........] - ETA: 2s - loss: 0.1397 - acc: 0.9688
89/115 [======================>.......] - ETA: 2s - loss: 0.2253 - acc: 0.9062
90/115 [======================>.......] - ETA: 2s - loss: 0.3808 - acc: 0.9062
91/115 [======================>.......] - ETA: 2s - loss: 0.2924 - acc: 0.8750
92/115 [=======================>......] - ETA: 2s - loss: 0.3436 - acc: 0.8750
93/115 [=======================>......] - ETA: 2s - loss: 0.1258 - acc: 0.9688
94/115 [=======================>......] - ETA: 2s - loss: 0.3462 - acc: 0.8438
95/115 [=======================>......] - ETA: 2s - loss: 0.2229 - acc: 0.9688
96/115 [========================>.....] - ETA: 1s - loss: 0.1786 - acc: 0.9062
97/115 [========================>.....] - ETA: 1s - loss: 0.3495 - acc: 0.8750
98/115 [========================>.....] - ETA: 1s - loss: 0.4217 - acc: 0.9062
99/115 [========================>.....] - ETA: 1s - loss: 0.1713 - acc: 0.9688
100/115 [=========================>....] - ETA: 1s - loss: 0.1135 - acc: 0.9688
101/115 [=========================>....] - ETA: 1s - loss: 0.4148 - acc: 0.7812
102/115 [=========================>....] - ETA: 1s - loss: 0.5526 - acc: 0.7812
103/115 [=========================>....] - ETA: 1s - loss: 0.4213 - acc: 0.8125
104/115 [==========================>...] - ETA: 1s - loss: 0.3874 - acc: 0.9062
105/115 [==========================>...] - ETA: 1s - loss: 0.4184 - acc: 0.8438
106/115 [==========================>...] - ETA: 0s - loss: 0.4132 - acc: 0.8438
107/115 [==========================>...] - ETA: 0s - loss: 0.2119 - acc: 0.9375
108/115 [===========================>..] - ETA: 0s - loss: 0.3295 - acc: 0.9062
109/115 [===========================>..] - ETA: 0s - loss: 0.2949 - acc: 0.8750
110/115 [===========================>..] - ETA: 0s - loss: 0.3758 - acc: 0.9062
111/115 [===========================>..] - ETA: 0s - loss: 0.1633 - acc: 1.0000
112/115 [============================>.] - ETA: 0s - loss: 0.3098 - acc: 0.9375
113/115 [============================>.] - ETA: 0s - loss: 0.2948 - acc: 0.8750
114/115 [============================>.] - ETA: 0s - loss: 0.1479 - acc: 1.0000
115/115 [==============================] - ETA: 0s - loss: 0.4252 - acc: 0.8438
115/115 [==============================] - 12s 104ms/step - loss: 0.4252 - acc: 0.8438

지금부터, 단순한 학습 반복이지만, 우리는 항상 모델이 프로세스를 만드는 중이라는 것을 알 수 있습니다.

plt.figure()
plt.ylabel("Loss")
plt.xlabel("Training Steps")
plt.ylim([0,2])
plt.plot(batch_stats_callback.batch_losses)
[<matplotlib.lines.Line2D at 0x7f86ec2fbef0>]

png

plt.figure()
plt.ylabel("Accuracy")
plt.xlabel("Training Steps")
plt.ylim([0,1])
plt.plot(batch_stats_callback.batch_acc)
[<matplotlib.lines.Line2D at 0x7f86ec2b7d30>]

png

예측을 확인하세요

이 전의 계획을 다시하기 위해서, 클래스 이름들의 정렬된 리스트를 첫번째로 얻으세요:

class_names = sorted(image_data.class_indices.items(), key=lambda pair:pair[1])
class_names = np.array([key.title() for key, value in class_names])
class_names
array(['Daisy', 'Dandelion', 'Roses', 'Sunflowers', 'Tulips'],
      dtype='<U10')

모델을 통해 이미지 배치를 실행시키세요. 그리고 인덱스들을 클래스 이름으로 바꾸세요.

predicted_batch = model.predict(image_batch)
predicted_id = np.argmax(predicted_batch, axis=-1)
predicted_label_batch = class_names[predicted_id]

결과를 계획하세요

label_id = np.argmax(label_batch, axis=-1)
plt.figure(figsize=(10,9))
plt.subplots_adjust(hspace=0.5)
for n in range(30):
  plt.subplot(6,5,n+1)
  plt.imshow(image_batch[n])
  color = "green" if predicted_id[n] == label_id[n] else "red"
  plt.title(predicted_label_batch[n].title(), color=color)
  plt.axis('off')
_ = plt.suptitle("Model predictions (green: correct, red: incorrect)")

png

당신의 모델을 내보내세요

당신은 모델을 학습시켜왔기 때문에, 저장된 모델을 내보내세요:

import time
t = time.time()

export_path = "/tmp/saved_models/{}".format(int(t))
model.save(export_path, save_format='tf')

export_path
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:111: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:111: Model.state_updates (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:111: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/training/tracking/tracking.py:111: Layer.updates (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.
Instructions for updating:
This property should not be used in TensorFlow 2.0, as updates are applied automatically.
INFO:tensorflow:Assets written to: /tmp/saved_models/1600845333/assets
INFO:tensorflow:Assets written to: /tmp/saved_models/1600845333/assets
'/tmp/saved_models/1600845333'

이제 우리는 그것을 새롭게 로딩 할 수 있고, 이는 같은 결과를 줄 것입니다:

reloaded = tf.keras.models.load_model(export_path)
result_batch = model.predict(image_batch)
reloaded_result_batch = reloaded.predict(image_batch)
abs(reloaded_result_batch - result_batch).max()
0.0

저장된 모델은 추후에 추론을 할 수도 있고, TFLite 나 TFjs 로 변환할 수 있습니다.