在本文中,我們將使用TensorFlow和Keras建立一個影像分類器,可以區分貓和狗的影像。為了做到這一點,我們將使用TensorFlow資料集中的cats_vs_dogs資料集。該資料集由25000張打過標籤的貓狗的圖像組成,其中80%的圖像用於訓練,10%用於驗證,10%用於測試。
我們從使用TensorFlow Datasets載入資料集開始。將資料集拆分為訓練集、驗證集和測試集,分別佔資料的80%、10%和10%,並定義一個函數來顯示資料集中的一些樣本影像。
<code>import tensorflow as tfimport matplotlib.pyplot as pltimport tensorflow_datasets as tfds# 加载数据(train_data, validation_data, test_data), info = tfds.load('cats_vs_dogs', split=['train[:80%]', 'train[80%:90%]', 'train[90%:]'], with_info=True, as_supervised=True)# 获取图像的标签label_names = info.features['label'].names# 定义一个函数来显示一些样本图像plt.figure(figsize=(10, 10))for i, (image, label) in enumerate(train_data.take(9)):ax = plt.subplot(3, 3, i + 1)plt.imshow(image)plt.title(label_names[label])plt.axis('off')</code>
在訓練模型之前,需要先對資料進行預處理。將把圖片的大小調整為150x150像素的統一尺寸,將像素值歸一化為0和1之間,並對資料進行批次處理,這樣就可以將其分批導入模型中。
<code>IMG_SIZE = 150</code>
<code>def format_image(image, label):image = tf.cast(image, tf.float32) / 255.0# Normalize the pixel valuesimage = tf.image.resize(image, (IMG_SIZE, IMG_SIZE))# Resize to the desired sizereturn image, labelbatch_size = 32train_data = train_data.map(format_image).shuffle(1000).batch(batch_size)validation_data = validation_data.map(format_image).batch(batch_size)test_data = test_data.map(format_image).batch(batch_size)</code>
#本文將使用預先訓練好的MobileNet V2模型作為基礎模型,並在其中添加一個全局平均池化層和一個緊密層來進行分類。本文將凍結基礎模型的權重,以便在訓練期間只更新頂層的權重。
<code>base_model = tf.keras.applications.MobileNetV2(input_shape=(IMG_SIZE, IMG_SIZE, 3), include_top=False, weights='imagenet')base_model.trainable = False</code>
<code>global_average_layer = tf.keras.layers.GlobalAveragePooling2D()prediction_layer = tf.keras.layers.Dense(1)model = tf.keras.Sequential([base_model,global_average_layer,prediction_layer])model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=0.0001),loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),metrics=['accuracy'])</code>
本文將對模型進行3個週期的訓練,並在每個週期之後在驗證集上對其進行驗證。我們將在訓練後保存模型,這樣我們就可以在以後的測試中使用它。
<code>global_average_layer = tf.keras.layers.GlobalAveragePooling2D()prediction_layer = tf.keras.layers.Dense(1)model = tf.keras.Sequential([base_model,global_average_layer,prediction_layer])model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=0.0001),loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),metrics=['accuracy'])</code>
<code>history = model.fit(train_data,epochs=3,validation_data=validation_data)</code>
模型歷史
如果想知道Mobilenet V2層是如何運作的,如下圖所示是該層的一個結果。
#訓練完成後將在測試集上評估模型,看看它在新數據上的表現如何。
<code>loaded_model = tf.keras.models.load_model('cats_vs_dogs.h5')test_loss, test_accuracy = loaded_model.evaluate(test_data)</code>
<code>print('Test accuracy:', test_accuracy)</code>
最後,本文將使用該模型對測試集中的一些樣本影像進行預測,並顯示結果。
<code>for image , _ in test_.take(90) : passpre = loaded_model.predict(image)plt.figure(figsize = (10 , 10))j = Nonefor value in enumerate(pre) : plt.subplot(7,7,value[0]+1)plt.imshow(image[value[0]])plt.xticks([])plt.yticks([])if value[1] > pre.mean() :j = 1color = 'blue' if j == _[value[0]] else 'red'plt.title('dog' , color = color)else : j = 0color = 'blue' if j == _[value[0]] else 'red'plt.title('cat' , color = color)plt.show()</code>
大功告成!我們透過使用TensorFlow和Keras創建了一個影像分類器,可以區分貓和狗的影像。透過一些調整和微調,也可以將這種方法應用於其他影像分類問題。
以上是使用TensorFlow和Keras建立貓狗圖片深度學習分類器的詳細內容。更多資訊請關注PHP中文網其他相關文章!