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:
- TensorFlow Hub modellerini
tf.keras
ile kullanın. - TensorFlow Hub'dan bir görüntü sınıflandırma modeli kullanın.
- 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-yerIMAGE_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-yerDownloading data from https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg 65536/61306 [================================] - 0s 0us/step 73728/61306 [====================================] - 0s 0us/step
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())
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:
- TensorFlow Hub'dan önceden eğitilmiş bir model seçin; ve
- Ö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-yerDownloading 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-yerFound 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-yerarray(['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")
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-yerEpoch 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")
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-yer2022-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")
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.