TensorFlow Hub ile öğrenimi aktarın

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın GitHub'da görüntüle Not defterini indir TF Hub modeline bakın

TensorFlow Hub , önceden eğitilmiş TensorFlow modellerinin bir deposudur.

Bu eğitimde aşağıdakilerin nasıl yapılacağı gösterilmektedir:

  1. TensorFlow Hub modellerini tf.keras ile kullanın.
  2. TensorFlow Hub'dan bir görüntü sınıflandırma modeli kullanın.
  3. Kendi görüntü sınıflarınız için bir modele ince ayar yapmak için basit transfer öğrenimi yapın.

Kurmak

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

import datetime

%load_ext tensorboard

Bir ImageNet sınıflandırıcı

ImageNet kıyaslama veri setinde önceden eğitilmiş bir sınıflandırıcı modeli kullanarak başlayacaksınız; başlangıç ​​eğitimi gerekmez!

Sınıflandırıcıyı indirin

TensorFlow Hub'dan MobileNetV2 önceden eğitilmiş bir model seçin ve hub.KerasLayer ile hub.KerasLayer katmanı olarak sarın. Aşağıdaki açılır menüde sağlanan örnekler de dahil olmak üzere, TensorFlow Hub'dan herhangi bir uyumlu görüntü sınıflandırıcı modeli burada çalışacaktır.

mobilenet_v2 ="https://tfhub.dev/google/tf2-preview/mobilenet_v2/classification/4"
inception_v3 = "https://tfhub.dev/google/imagenet/inception_v3/classification/5"

classifier_model = mobilenet_v2
tutucu2 l10n-yer
IMAGE_SHAPE = (224, 224)

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

Tek bir görüntü üzerinde çalıştırın

Modeli denemek için tek bir görsel indirin:

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
tutucu4 l10n-yer
Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg
65536/61306 [================================] - 0s 0us/step
73728/61306 [====================================] - 0s 0us/step

png

grace_hopper = np.array(grace_hopper)/255.0
grace_hopper.shape
tutucu6 l10n-yer
(224, 224, 3)

Bir toplu iş boyutu ekleyin ( np.newaxis ile) ve resmi modele iletin:

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

Sonuç, görüntü için her sınıfın olasılığını derecelendiren 1001 elemanlı bir logit vektörüdür.

En üst sınıf kimliği tf.math.argmax ile bulunabilir:

predicted_class = tf.math.argmax(result[0], axis=-1)
predicted_class
tutucu10 l10n-yer
<tf.Tensor: shape=(), dtype=int64, numpy=653>

Tahminlerin kodunu çöz

predicted_class kimliğini ( 653 gibi) alın ve tahminlerin kodunu çözmek için ImageNet veri kümesi etiketlerini getirin:

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
24576/10484 [======================================================================] - 0s 0us/step
-yer tutucu13 l10n-yer
plt.imshow(grace_hopper)
plt.axis('off')
predicted_class_name = imagenet_labels[predicted_class]
_ = plt.title("Prediction: " + predicted_class_name.title())

png

Basit aktarım öğrenimi

Ancak, orijinal ImageNet veri kümesinde yer almayan (önceden eğitilmiş modelin eğitildiği) sınıfları olan kendi veri kümenizi kullanarak özel bir sınıflandırıcı oluşturmak isterseniz ne olur?

Bunu yapmak için şunları yapabilirsiniz:

  1. TensorFlow Hub'dan önceden eğitilmiş bir model seçin; ve
  2. Özel veri kümenizden sınıfları tanımak için üst (son) katmanı yeniden eğitin.

veri kümesi

Bu örnekte, TensorFlow çiçekler veri kümesini kullanacaksınız:

data_root = tf.keras.utils.get_file(
  'flower_photos',
  'https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz',
   untar=True)
tutucu15 l10n-yer
Downloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
228818944/228813984 [==============================] - 7s 0us/step
228827136/228813984 [==============================] - 7s 0us/step

İlk olarak, tf.keras.utils.image_dataset_from_directory ile disk dışındaki görüntü verilerini kullanarak bu verileri modele yükleyin, bu da bir tf.data.Dataset oluşturacaktır:

batch_size = 32
img_height = 224
img_width = 224

train_ds = tf.keras.utils.image_dataset_from_directory(
  str(data_root),
  validation_split=0.2,
  subset="training",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size
)

val_ds = tf.keras.utils.image_dataset_from_directory(
  str(data_root),
  validation_split=0.2,
  subset="validation",
  seed=123,
  image_size=(img_height, img_width),
  batch_size=batch_size
)
tutucu17 l10n-yer
Found 3670 files belonging to 5 classes.
Using 2936 files for training.
Found 3670 files belonging to 5 classes.
Using 734 files for validation.

Çiçekler veri kümesinin beş sınıfı vardır:

class_names = np.array(train_ds.class_names)
print(class_names)
tutucu19 l10n-yer
['daisy' 'dandelion' 'roses' 'sunflowers' 'tulips']

İkincisi, TensorFlow Hub'ın görüntü modelleri için kuralı [0, 1] aralığında kayan girişler beklemek olduğundan, bunu başarmak için tf.keras.layers.Rescaling ön işleme katmanını kullanın.

normalization_layer = tf.keras.layers.Rescaling(1./255)
train_ds = train_ds.map(lambda x, y: (normalization_layer(x), y)) # Where x—images, y—labels.
val_ds = val_ds.map(lambda x, y: (normalization_layer(x), y)) # Where x—images, y—labels.

Üçüncü olarak, Dataset.prefetch ile arabelleğe alınmış önceden getirmeyi kullanarak giriş ardışık düzenini tamamlayın, böylece verileri G/Ç engelleme sorunları olmadan diskten sağlayabilirsiniz.

Bunlar, verileri yüklerken kullanmanız gereken en önemli tf.data yöntemlerinden bazılarıdır. İlgilenen okuyucular , tf.data API kılavuzundaki Daha iyi performans bölümünde, bunlar hakkında daha fazla bilgi edinebilir ve ayrıca verilerin diske nasıl önbelleğe alınacağını ve diğer teknikleri öğrenebilir.

AUTOTUNE = tf.data.AUTOTUNE
train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
for image_batch, labels_batch in train_ds:
  print(image_batch.shape)
  print(labels_batch.shape)
  break
-yer tutucu23 l10n-yer
(32, 224, 224, 3)
(32,)
2022-01-26 05:06:19.465331: W tensorflow/core/kernels/data/cache_dataset_ops.cc:768] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.

Sınıflandırıcıyı bir dizi görüntü üzerinde çalıştırın

Şimdi sınıflandırıcıyı bir görüntü toplu işinde çalıştırın:

result_batch = classifier.predict(train_ds)
predicted_class_names = imagenet_labels[tf.math.argmax(result_batch, axis=-1)]
predicted_class_names
-yer tutucu26 l10n-yer
array(['daisy', 'coral fungus', 'rapeseed', ..., 'daisy', 'daisy',
       'birdhouse'], dtype='<U30')

Bu tahminlerin resimlerle nasıl örtüştüğünü kontrol edin:

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

Sonuçlar mükemmel olmaktan uzak, ancak bunların modelin eğitildiği sınıflar olmadığı düşünüldüğünde ("papatya" hariç) makul.

Başsız modeli indirin

TensorFlow Hub, üst sınıflandırma katmanı olmayan modelleri de dağıtır. Bunlar, transfer öğrenmeyi kolayca gerçekleştirmek için kullanılabilir.

TensorFlow Hub'dan MobileNetV2 önceden eğitilmiş bir model seçin. Açılır menüdeki örnekler de dahil olmak üzere TensorFlow Hub'dan herhangi bir uyumlu görüntü özelliği vektör modeli burada çalışacaktır.

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

feature_extractor_model = mobilenet_v2

Önceden eğitilmiş modeli bir Keras katmanı olarak hub.KerasLayer ile sararak özellik çıkarıcıyı oluşturun. Değişkenleri dondurmak için trainable=False bağımsız değişkenini kullanın, böylece eğitim yalnızca yeni sınıflandırıcı katmanını değiştirir:

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

Özellik çıkarıcı, her görüntü için 1280 uzunluğunda bir vektör döndürür (bu örnekte görüntü toplu boyutu 32'de kalır):

feature_batch = feature_extractor_layer(image_batch)
print(feature_batch.shape)
tutucu31 l10n-yer
(32, 1280)

Bir sınıflandırma başlığı ekleyin

Modeli tamamlamak için, özellik çıkarıcı katmanını bir tf.keras.Sequential modeline sarın ve sınıflandırma için tam bağlantılı bir katman ekleyin:

num_classes = len(class_names)

model = tf.keras.Sequential([
  feature_extractor_layer,
  tf.keras.layers.Dense(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])

Modeli eğit

Eğitim sürecini yapılandırmak için Model.compile kullanın ve günlükler oluşturmak ve depolamak için bir tf.keras.callbacks.TensorBoard geri çağrısı ekleyin:

model.compile(
  optimizer=tf.keras.optimizers.Adam(),
  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
  metrics=['acc'])

log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(
    log_dir=log_dir,
    histogram_freq=1) # Enable histogram computation for every epoch.

Şimdi modeli eğitmek için Model.fit yöntemini kullanın.

Bu örneği kısa tutmak için sadece 10 dönem için eğitim alacaksınız. TensorBoard'daki eğitim ilerlemesini daha sonra görselleştirmek için, günlükleri bir TensorBoard geri araması oluşturun ve saklayın.

NUM_EPOCHS = 10

history = model.fit(train_ds,
                    validation_data=val_ds,
                    epochs=NUM_EPOCHS,
                    callbacks=tensorboard_callback)
tutucu39 l10n-yer
Epoch 1/10
92/92 [==============================] - 7s 42ms/step - loss: 0.7904 - acc: 0.7210 - val_loss: 0.4592 - val_acc: 0.8515
Epoch 2/10
92/92 [==============================] - 3s 33ms/step - loss: 0.3850 - acc: 0.8713 - val_loss: 0.3694 - val_acc: 0.8787
Epoch 3/10
92/92 [==============================] - 3s 33ms/step - loss: 0.3027 - acc: 0.9057 - val_loss: 0.3367 - val_acc: 0.8856
Epoch 4/10
92/92 [==============================] - 3s 33ms/step - loss: 0.2524 - acc: 0.9237 - val_loss: 0.3210 - val_acc: 0.8869
Epoch 5/10
92/92 [==============================] - 3s 33ms/step - loss: 0.2164 - acc: 0.9373 - val_loss: 0.3124 - val_acc: 0.8896
Epoch 6/10
92/92 [==============================] - 3s 33ms/step - loss: 0.1888 - acc: 0.9469 - val_loss: 0.3070 - val_acc: 0.8937
Epoch 7/10
92/92 [==============================] - 3s 33ms/step - loss: 0.1668 - acc: 0.9550 - val_loss: 0.3032 - val_acc: 0.9005
Epoch 8/10
92/92 [==============================] - 3s 33ms/step - loss: 0.1487 - acc: 0.9619 - val_loss: 0.3004 - val_acc: 0.9005
Epoch 9/10
92/92 [==============================] - 3s 33ms/step - loss: 0.1335 - acc: 0.9687 - val_loss: 0.2981 - val_acc: 0.9019
Epoch 10/10
92/92 [==============================] - 3s 33ms/step - loss: 0.1206 - acc: 0.9748 - val_loss: 0.2964 - val_acc: 0.9046

Metriklerin her dönemle nasıl değiştiğini görmek ve diğer skaler değerleri izlemek için TensorBoard'u başlatın:

%tensorboard --logdir logs/fit

Tahminleri kontrol edin

Model tahminlerinden sıralı sınıf adları listesini alın:

predicted_batch = model.predict(image_batch)
predicted_id = tf.math.argmax(predicted_batch, axis=-1)
predicted_label_batch = class_names[predicted_id]
print(predicted_label_batch)
tutucu42 l10n-yer
['roses' 'dandelion' 'tulips' 'sunflowers' 'dandelion' 'roses' 'dandelion'
 'roses' 'tulips' 'dandelion' 'tulips' 'tulips' 'sunflowers' 'tulips'
 'dandelion' 'roses' 'daisy' 'tulips' 'dandelion' 'dandelion' 'dandelion'
 'tulips' 'sunflowers' 'roses' 'sunflowers' 'dandelion' 'tulips' 'roses'
 'roses' 'sunflowers' 'tulips' 'sunflowers']

Model tahminlerini çizin:

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_label_batch[n].title())
  plt.axis('off')
_ = plt.suptitle("Model predictions")

png

Modelinizi dışa aktarın ve yeniden yükleyin

Artık modeli eğittiğinize göre, daha sonra yeniden kullanmak üzere SavedModel olarak dışa aktarın.

t = time.time()

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

export_path
tutucu45 l10n-yer
2022-01-26 05:07:03.429901: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/saved_models/1643173621/assets
INFO:tensorflow:Assets written to: /tmp/saved_models/1643173621/assets
'/tmp/saved_models/1643173621'

SavedModel'i yeniden yükleyebileceğinizi ve modelin aynı sonuçları verebileceğini onaylayın:

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
reloaded_predicted_id = tf.math.argmax(reloaded_result_batch, axis=-1)
reloaded_predicted_label_batch = class_names[reloaded_predicted_id]
print(reloaded_predicted_label_batch)
['roses' 'dandelion' 'tulips' 'sunflowers' 'dandelion' 'roses' 'dandelion'
 'roses' 'tulips' 'dandelion' 'tulips' 'tulips' 'sunflowers' 'tulips'
 'dandelion' 'roses' 'daisy' 'tulips' 'dandelion' 'dandelion' 'dandelion'
 'tulips' 'sunflowers' 'roses' 'sunflowers' 'dandelion' 'tulips' 'roses'
 'roses' 'sunflowers' 'tulips' 'sunflowers']
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(reloaded_predicted_label_batch[n].title())
  plt.axis('off')
_ = plt.suptitle("Model predictions")

png

Sonraki adımlar

Çıkarım için yüklemek veya bir TensorFlow Lite modeline (cihazda makine öğrenimi için) veya bir TensorFlow.js modeline (JavaScript'te makine öğrenimi için) dönüştürmek için SavedModel'i kullanabilirsiniz.

TensorFlow Hub'ın önceden eğitilmiş modellerini resim, metin, ses ve video görevlerinde nasıl kullanacağınızı öğrenmek için daha fazla öğreticiyi keşfedin.