TensorFlow.org पर देखें | Google Colab में चलाएं | गिटहब पर देखें | नोटबुक डाउनलोड करें | टीएफ हब मॉडल देखें |
TensorFlow हब पूर्व-प्रशिक्षित TensorFlow मॉडल का भंडार है।
यह ट्यूटोरियल दर्शाता है कि कैसे:
- TensorFlow हब से
tf.keras
के साथ मॉडल का उपयोग करें। - TensorFlow हब से छवि वर्गीकरण मॉडल का उपयोग करें।
- अपने स्वयं के छवि वर्गों के लिए एक मॉडल को फाइन-ट्यून करने के लिए सरल स्थानांतरण शिक्षण करें।
सेट अप
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
एक इमेजनेट क्लासिफायरियर
आप इमेजनेट बेंचमार्क डेटासेट पर पूर्व-प्रशिक्षित क्लासिफायर मॉडल का उपयोग करके शुरू करेंगे—किसी प्रारंभिक प्रशिक्षण की आवश्यकता नहीं है!
क्लासिफायरियर डाउनलोड करें
TensorFlow हब से एक MobileNetV2 पूर्व-प्रशिक्षित मॉडल का चयन करें और इसे हब के साथ केरस परत के रूप में लपेटें। hub.KerasLayer
। TensorFlow हब का कोई भी संगत इमेज क्लासिफायर मॉडल यहां काम करेगा, जिसमें नीचे दिए गए ड्रॉप-डाउन में दिए गए उदाहरण भी शामिल हैं।
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
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 73728/61306 [====================================] - 0s 0us/step
grace_hopper = np.array(grace_hopper)/255.0
grace_hopper.shape
(224, 224, 3)
बैच आयाम जोड़ें ( np.newaxis
के साथ) और छवि को मॉडल में पास करें:
result = classifier.predict(grace_hopper[np.newaxis, ...])
result.shape
(1, 1001)
परिणाम लॉग का 1001-तत्व वेक्टर है, छवि के लिए प्रत्येक वर्ग की संभावना को रेटिंग देता है।
शीर्ष श्रेणी आईडी tf.math.argmax
के साथ मिल सकती है:
predicted_class = tf.math.argmax(result[0], axis=-1)
predicted_class
<tf.Tensor: shape=(), dtype=int64, numpy=653>
भविष्यवाणियों को डिकोड करें
predicted_class
आईडी (जैसे 653
) लें और भविष्यवाणियों को डीकोड करने के लिए इमेजनेट डेटासेट लेबल प्राप्त करें:
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
plt.imshow(grace_hopper)
plt.axis('off')
predicted_class_name = imagenet_labels[predicted_class]
_ = plt.title("Prediction: " + predicted_class_name.title())
सरल स्थानांतरण सीखना
लेकिन क्या होगा यदि आप अपने स्वयं के डेटासेट का उपयोग करके एक कस्टम क्लासिफायरियर बनाना चाहते हैं जिसमें ऐसी कक्षाएं हैं जो मूल इमेजनेट डेटासेट में शामिल नहीं हैं (जिस पर पूर्व-प्रशिक्षित मॉडल को प्रशिक्षित किया गया था)?
ऐसा करने के लिए, आप कर सकते हैं:
- TensorFlow हब से पूर्व-प्रशिक्षित मॉडल का चयन करें; तथा
- अपने कस्टम डेटासेट से कक्षाओं को पहचानने के लिए शीर्ष (अंतिम) परत को फिर से प्रशिक्षित करें।
डेटासेट
इस उदाहरण में, आप 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 [==============================] - 7s 0us/step 228827136/228813984 [==============================] - 7s 0us/step
सबसे पहले, इस डेटा को tf.keras.utils.image_dataset_from_directory
के साथ डिस्क से छवि डेटा का उपयोग करके मॉडल में लोड करें, जो एक tf.data.Dataset
उत्पन्न करेगा:
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
)
Found 3670 files belonging to 5 classes. Using 2936 files for training. Found 3670 files belonging to 5 classes. Using 734 files for validation.
फूल डेटासेट में पाँच वर्ग होते हैं:
class_names = np.array(train_ds.class_names)
print(class_names)
['daisy' 'dandelion' 'roses' 'sunflowers' 'tulips']
दूसरा, क्योंकि छवि मॉडल के लिए TensorFlow हब का सम्मेलन [0, 1]
श्रेणी में फ्लोट इनपुट की अपेक्षा करना है, इसे प्राप्त करने के लिए tf.keras.layers.Rescaling
प्रीप्रोसेसिंग परत का उपयोग करें।
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.
तीसरा, Dataset.prefetch
के साथ बफ़र्ड प्रीफ़ेचिंग का उपयोग करके इनपुट पाइपलाइन को समाप्त करें, ताकि आप I/O अवरोधित समस्याओं के बिना डिस्क से डेटा प्राप्त कर सकें।
ये कुछ सबसे महत्वपूर्ण tf.data
विधियाँ हैं जिनका उपयोग आपको डेटा लोड करते समय करना चाहिए। इच्छुक पाठक उनके बारे में अधिक जान सकते हैं, साथ ही tf.data API गाइड के साथ बेहतर प्रदर्शन में डिस्क और अन्य तकनीकों में डेटा को कैश करने के तरीके के बारे में जान सकते हैं।
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
(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.
छवियों के एक बैच पर क्लासिफायरियर चलाएँ
अब, क्लासिफायर को इमेज बैच पर चलाएँ:
result_batch = classifier.predict(train_ds)
predicted_class_names = imagenet_labels[tf.math.argmax(result_batch, axis=-1)]
predicted_class_names
प्लेसहोल्डर26 l10n-प्लेसहोल्डरarray(['daisy', 'coral fungus', 'rapeseed', ..., 'daisy', 'daisy', 'birdhouse'], 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")
परिणाम सही से बहुत दूर हैं, लेकिन यह देखते हुए उचित है कि ये वे वर्ग नहीं हैं जिनके लिए मॉडल को प्रशिक्षित किया गया था ("डेज़ी" को छोड़कर)।
हेडलेस मॉडल डाउनलोड करें
TensorFlow हब शीर्ष वर्गीकरण परत के बिना भी मॉडल वितरित करता है। इनका उपयोग ट्रांसफर लर्निंग को आसानी से करने के लिए किया जा सकता है।
TensorFlow हब से एक MobileNetV2 पूर्व-प्रशिक्षित मॉडल चुनें। TensorFlow हब से कोई भी संगत छवि सुविधा वेक्टर मॉडल यहां काम करेगा, जिसमें ड्रॉप-डाउन मेनू के उदाहरण भी शामिल हैं।
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
हब के साथ hub.KerasLayer
परत के रूप में पूर्व-प्रशिक्षित मॉडल को लपेटकर फीचर एक्सट्रैक्टर बनाएं। चर को फ्रीज करने के लिए trainable=False
तर्क का उपयोग करें, ताकि प्रशिक्षण केवल नई क्लासिफायरियर परत को संशोधित करे:
feature_extractor_layer = hub.KerasLayer(
feature_extractor_model,
input_shape=(224, 224, 3),
trainable=False)
फीचर एक्सट्रैक्टर प्रत्येक छवि के लिए 1280-लंबा वेक्टर देता है (इस उदाहरण में छवि बैच का आकार 32 पर रहता है):
feature_batch = feature_extractor_layer(image_batch)
print(feature_batch.shape)
(32, 1280)
एक वर्गीकरण शीर्ष संलग्न करें
मॉडल को पूरा करने के लिए, फीचर एक्सट्रैक्टर लेयर को tf.keras.Sequential
मॉडल में लपेटें और वर्गीकरण के लिए पूरी तरह से कनेक्टेड लेयर जोड़ें:
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])
मॉडल को प्रशिक्षित करें
प्रशिक्षण प्रक्रिया को कॉन्फ़िगर करने के लिए Model.compile
का उपयोग करें और लॉग बनाने और संग्रहीत करने के लिए tf.keras.callbacks.TensorBoard
कॉलबैक जोड़ें:
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.
अब मॉडल को प्रशिक्षित करने के लिए Model.fit
पद्धति का उपयोग करें।
इस उदाहरण को छोटा रखने के लिए, आप केवल 10 युगों के लिए प्रशिक्षण लेंगे। बाद में TensorBoard में प्रशिक्षण प्रगति की कल्पना करने के लिए, एक TensorBoard कॉलबैक लॉग बनाएँ और संग्रहीत करें।
NUM_EPOCHS = 10
history = model.fit(train_ds,
validation_data=val_ds,
epochs=NUM_EPOCHS,
callbacks=tensorboard_callback)
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
प्रत्येक युग के साथ मीट्रिक कैसे बदलते हैं और अन्य स्केलर मानों को ट्रैक करने के लिए TensorBoard प्रारंभ करें:
%tensorboard --logdir logs/fit
भविष्यवाणियों की जाँच करें
मॉडल भविष्यवाणियों से वर्ग के नामों की क्रमबद्ध सूची प्राप्त करें:
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)
['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(predicted_label_batch[n].title())
plt.axis('off')
_ = plt.suptitle("Model predictions")
अपने मॉडल को निर्यात और पुनः लोड करें
अब जब आपने मॉडल को प्रशिक्षित कर लिया है, तो इसे बाद में पुन: उपयोग करने के लिए सहेजे गए मॉडल के रूप में निर्यात करें।
t = time.time()
export_path = "/tmp/saved_models/{}".format(int(t))
model.save(export_path)
export_path
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'
पुष्टि करें कि आप सहेजे गए मॉडल को पुनः लोड कर सकते हैं और मॉडल समान परिणाम आउटपुट करने में सक्षम है:
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.051 l10n-
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")
अगले कदम
आप अनुमान के लिए लोड करने के लिए SavedModel का उपयोग कर सकते हैं या इसे TensorFlow Lite मॉडल (ऑन-डिवाइस मशीन लर्निंग के लिए) या TensorFlow.js मॉडल (जावास्क्रिप्ट में मशीन लर्निंग के लिए) में बदल सकते हैं।
छवि, पाठ, ऑडियो और वीडियो कार्यों पर TensorFlow हब से पूर्व-प्रशिक्षित मॉडल का उपयोग करने का तरीका जानने के लिए और अधिक ट्यूटोरियल खोजें।