View on TensorFlow.org
|
Run in Google Colab
|
View source on GitHub
|
Download notebook
|
텐서플로 허브텐서플로 허브는 이 전에 학습된 모델들의 요소들을 공유하는 하나의 방법입니다. 학습된 모델들의 검색가능한 리스트에 대한 텐서플로 모듈 허브를 보세요. 이 튜토리얼은 입증합니다:
tf.keras로 텐서플로 허브를 사용하는 방법.- 텐서플로 허브를 사용하여 이미지 분류를 하는 방법.
- 간단한 전이학습을 하는 방법.
설치하기
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

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())

간단한 전이 학습
텐서플로 허브를 사용함으로써, 우리의 데이터셋에 있는 클래스들을 인지하기 위해 모델의 최상위 층을 재학습 시키는 것이 쉬워졌습니다.
데이터셋
이 예제를 해결하기 위해, 텐서플로의 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")

이미지 속성을 가진 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>]

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>]

예측을 확인하세요
이 전의 계획을 다시하기 위해서, 클래스 이름들의 정렬된 리스트를 첫번째로 얻으세요:
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)")

당신의 모델을 내보내세요
당신은 모델을 학습시켜왔기 때문에, 저장된 모델을 내보내세요:
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
View on TensorFlow.org
Run in Google Colab
View source on GitHub
Download notebook