Передача обучения с помощью TensorFlow Hub

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


TensorFlow Hub - это репозиторий предварительно обученных моделей TensorFlow.

В этом руководстве показано, как:

  1. Используйте модели из TensorFlow Hub с tf.keras
  2. Используйте модель классификации изображений из TensorFlow Hub
  3. Простое переносное обучение для точной настройки модели для ваших собственных классов изображений

Настроить

import numpy as np import time  import PIL.Image as Image import matplotlib.pylab as plt  import tensorflow as tf import tensorflow_hub as hub 

Классификатор ImageNet

Вы начнете с использования предварительно обученной модели классификатора, чтобы сделать снимок и предсказать, что это за изображение - обучение не требуется!

Скачать классификатор

Используйте hub.KerasLayer для загрузки модели MobileNetV2 из TensorFlow Hub. Здесь будет работать любая совместимая модель классификатора изображений из tfhub.dev.

classifier_model ="https://tfhub.dev/google/tf2-preview/mobilenet_v2/classification/4"  
IMAGE_SHAPE = (224, 224)  classifier = tf.keras.Sequential([     hub.KerasLayer(classifier_model, input_shape=IMAGE_SHAPE+(3,)) ]) 

Запустите его на одном изображении

Загрузите одно изображение, чтобы примерить модель.

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 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-элементный вектор логитов, оценивающий вероятность каждого класса для изображения.

Итак, идентификатор высшего класса можно найти с помощью argmax:

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

Расшифруйте предсказания

Возьмите прогнозируемый идентификатор класса и ImageNet метки 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()) 
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/ImageNetLabels.txt 16384/10484 [==============================================] - 0s 0us/step  
plt.imshow(grace_hopper) plt.axis('off') predicted_class_name = imagenet_labels[predicted_class] _ = plt.title("Prediction: " + predicted_class_name.title()) 

PNG

Простое трансферное обучение

Но что, если вы хотите обучить классификатор для набора данных с разными классами? Вы также можете использовать модель из TFHub для обучения настраиваемого классификатора изображений, повторно обучив верхний уровень модели распознавать классы в нашем наборе данных.

Набор данных

В этом примере вы будете использовать набор данных цветов TensorFlow:

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 228818944/228813984 [==============================] - 5s 0us/step  

Самый простой способ загрузить эти данные в нашу модель - использовать tf.keras.preprocessing.image.ImageDataGenerator ,

Соглашения TensorFlow Hub для моделей изображений - ожидать входных данных с плавающей запятой в диапазоне [0, 1] . Используйте ImageDataGenerator «S 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', 'bee', 'barn spider', 'daisy', 'balloon', 'daisy',        'cardoon', 'daisy', 'daisy', 'diaper', 'quill', 'wreck', 'hip',        'daisy', 'vase', 'daisy', 'daisy', 'daisy', 'cardoon', 'daisy',        'sea urchin', 'picket fence', 'daisy', 'strawberry',        'coral fungus', 'picket fence', 'quill', 'daisy', 'daisy', 'pot',        'sarong', 'hair slide'], 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 для атрибуции изображений.

Результаты далеки от идеальных, но разумные, учитывая, что это не те классы, для которых модель была обучена (кроме «ромашки»).

Скачать модель без головы

TensorFlow Hub также распространяет модели без верхнего уровня классификации. Их можно использовать для простого переноса обучения.

Здесь будет работать любая совместимая векторная модель функции изображения из tfhub.dev.

feature_extractor_model = "https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4"  

Создайте экстрактор признаков. Используйте trainable=False чтобы зафиксировать переменные в слое экстрактора признаков, чтобы при обучении изменялся только новый слой классификатора.

feature_extractor_layer = hub.KerasLayer(     feature_extractor_model, input_shape=(224, 224, 3), trainable=False) 

Он возвращает вектор длиной 1280 для каждого изображения:

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

Прикрепите классификационную головку

Теперь оберните слой хаба в модель tf.keras.Sequential и добавьте новый слой классификации.

model = tf.keras.Sequential([   feature_extractor_layer,   tf.keras.layers.Dense(image_data.num_classes) ])  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=tf.keras.losses.CategoricalCrossentropy(from_logits=True),   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(image_data, epochs=2,                     steps_per_epoch=steps_per_epoch,                     callbacks=[batch_stats_callback]) 
Epoch 1/2 115/115 [==============================] - 12s 100ms/step - loss: 0.4156 - acc: 0.8750 Epoch 2/2 115/115 [==============================] - 12s 101ms/step - loss: 0.1960 - acc: 0.9375  

Теперь, даже после нескольких итераций обучения, мы уже можем видеть, что модель успешно справляется с задачей.

plt.figure() plt.ylabel("Loss") plt.xlabel("Training Steps") plt.ylim([0,2]) plt.plot(batch_stats_callback.batch_losses) 
[<matplotlib.lines.Line2D at 0x7f3ac9d00b38>] 
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 0x7f3ac49b3e48>] 
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

Экспортируйте вашу модель

Теперь, когда вы обучили модель, экспортируйте ее как SavedModel для дальнейшего использования.

t = time.time()  export_path = "/tmp/saved_models/{}".format(int(t)) model.save(export_path)  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/1601602065/assets  INFO:tensorflow:Assets written to: /tmp/saved_models/1601602065/assets  '/tmp/saved_models/1601602065' 

Теперь подтвердите, что мы можем перезагрузить его, и он по-прежнему дает те же результаты:

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 

Эта SavedModel может быть загружена для последующего вывода или преобразована в TFLite или TFjs .


Источник: www.tensorflow.org

Комментарии: