《python深度學習》筆記---5.2-3、貓狗分類(基本模型)
一、總結
一句話總結:
模型的話也是比較普通的卷積神經網絡,就是圖像數據用的生成器:ImageDataGenerator
1、ImageDataGenerator.flow_from_directory常用參數的意思?
|||-begin
train_generator = train_datagen.flow_from_directory( train_dir, # 目標目錄 target_size=(150, 150), # 將所有圖像的大小調整為 150×150 batch_size=20, class_mode='binary') # 因為使用了binary_crossentropy 損失,所以需要用二進制標簽
|||-end
directory:【目標目錄的路徑】:目標目錄的路徑。每個類應該包含一個子目錄。任何在子目錄樹下的 PNG, JPG, BMP, PPM 或 TIF 圖像,都將被包含在生成器中。
target_size:【所有的圖像將被調整到的尺寸】:整數元組 (height, width),默認:(256, 256)。所有的圖像將被調整到的尺寸。
batch_size:【批大小】:一批數據的大小(默認 32)。
class_mode:【決定返回的標簽數組的類型】:"categorical", "binary", "sparse", "input" 或 None 之一。默認:"categorical"。決定返回的標簽數組的類型:
2、tf.keras.preprocessing.image.ImageDataGenerator 作用?
【Generate batches of tensor image data】:Generate batches of tensor image data with real-time data augmentation.
3、tf.keras.preprocessing.image.ImageDataGenerator.flow_from_directory 作用?
【data augumentation】:Takes the path to a directory & generates batches of augmented data.
4、ImageDataGenerator生成的train_generator輸出格式?
data_batch, labels_batch這種形式
for data_batch, labels_batch in train_generator: print('data batch shape:', data_batch.shape)
5、fit模型擬合的時候,訓練數據和驗證數據都用生成器數據實例?
第一個參數就是train_generator
驗證集數據就可以用validation_data=validation_generator
history = model.fit( train_generator, steps_per_epoch=100, epochs=30, validation_data=validation_generator, validation_steps=50)
6、如何理解下面這段fit代碼?
|||-begin
history = model.fit( train_generator, steps_per_epoch=100, epochs=30, validation_data=validation_generator, validation_steps=50)
|||-end
【Python生成器】:它的第一個參數應該是一個 Python 生成器,可以不停地生 成輸入和目標組成的批量,比如 train_generator。
【要知道每一輪需要從生成器中抽取多少個樣本】:因為數據是不斷生成的,所以 Keras 模型 要知道每一輪需要從生成器中抽取多少個樣本。
【從生成器中抽取 steps_per_epoch 個批量后進入下一個輪次】:這是 steps_per_epoch 參數的作用:從生成器中抽取 steps_per_epoch 個批量后(即運行了 steps_per_epoch 次梯度下降),擬合過程 將進入下一個輪次。
【每個批量包含20 個樣本】:本例中,每個批量包含20 個樣本,所以讀取完所有2000 個樣本需要100 個批量。
二、5.2-3、貓狗分類(基本模型)
博客對應課程的視頻位置:
2、構建網絡
In [1]:
import os, shutil
# 原始數據集解壓目錄的路徑
original_dataset_dir = 'E:\\78_recorded_lesson\\001_course_github\\AI_dataSet\\dogs-vs-cats\\kaggle_original_data\\train'
# 保存較小數據集的目錄
base_dir = 'E:\\78_recorded_lesson\\001_course_github\\AI_dataSet\\dogs-vs-cats\\cats_and_dogs_small'
# 分別對應划分后的訓練、驗證和測試的目錄
train_dir = os.path.join(base_dir, 'train')
validation_dir = os.path.join(base_dir, 'validation')
test_dir = os.path.join(base_dir, 'test')
# 貓的訓練圖像目錄
train_cats_dir = os.path.join(train_dir, 'cats')
# 狗的訓練圖像目錄
train_dogs_dir = os.path.join(train_dir, 'dogs')
# 貓的驗證圖像目錄
validation_cats_dir = os.path.join(validation_dir, 'cats')
# 狗的驗證圖像目錄
validation_dogs_dir = os.path.join(validation_dir, 'dogs')
# 貓的測試圖像目錄
test_cats_dir = os.path.join(test_dir, 'cats')
# 狗的測試圖像目錄
test_dogs_dir = os.path.join(test_dir, 'dogs')
In [2]:
import pandas as pd
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
In [2]:
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(32, (3, 3), activation='relu',
input_shape=(150, 150, 3)))
model.add(tf.keras.layers.MaxPooling2D((2, 2)))
model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D((2, 2)))
model.add(tf.keras.layers.Conv2D(128, (3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D((2, 2)))
model.add(tf.keras.layers.Conv2D(128, (3, 3), activation='relu'))
model.add(tf.keras.layers.MaxPooling2D((2, 2)))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(512, activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
model.summary()
3、配置模型用於訓練
In [3]:
model.compile(loss='binary_crossentropy',
optimizer=tf.keras.optimizers.RMSprop(lr=1e-4),
metrics=['acc'])
4、數據預處理
注意:ImageDataGenerator
In [6]:
# 將所有圖像乘以 1/255 縮放
train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
test_datagen = tf.keras.preprocessing.image.ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
train_dir, # 目標目錄
target_size=(150, 150), # 將所有圖像的大小調整為 150×150
batch_size=20,
class_mode='binary') # 因為使用了binary_crossentropy 損失,所以需要用二進制標簽
validation_generator = test_datagen.flow_from_directory(
validation_dir,
target_size=(150, 150),
batch_size=20,
class_mode='binary')
In [7]:
for data_batch, labels_batch in train_generator:
print('data batch shape:', data_batch.shape)
# print(data_batch)
print('labels batch shape:', labels_batch.shape)
# print(labels_batch)
break
5、利用批量生成器擬合模型
In [8]:
history = model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=30,
validation_data=validation_generator,
validation_steps=50)
6、保存模型
In [9]:
model.save('cats_and_dogs_small_1.h5')
7、繪制訓練過程中的損失曲線和精度曲線
In [10]:
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()