好久沒更新了,一巴掌拍了拍自己閑得發(fā)慌的臉。雖說生活的壓力不大,但是也不能太咸魚啊。平時浪歸浪,但是學習和工作還是不能落下。
最近的工作太繁雜了,不知道要從何寫起,想起之前寫過用tensorflow1.x實現(xiàn)的「貓狗識別」的案例,這次就寫一個用tensorflow2.0實現(xiàn)的案例吧。
上一個案例傳送門:
深度學習-使用tensorflow實現(xiàn)貓狗識別
1. 數(shù)據集的準備
貓狗識別的數(shù)據集依舊可以從Kaggle上下載,數(shù)據集下載鏈接:
https://www.kaggle.com/c/dogs-vs-cats
下載后解壓,得到如下的文件夾
文件夾train里面放著25000張圖像,貓和狗的圖像分別都是12500張,圖像名稱上都有標明類別。文件夾test1里面放的是測試集,里面有12500張圖像,都沒有標簽,要自己來預測分類。
把數(shù)據集目錄整理成如下的形式
文件夾test1不變,新建一個文件夾validation,在文件夾train中分別拿出貓和狗的圖像各2500張,存到文件夾validation中。文件夾train和validation內都要新建文件夾cat和dog,分別把貓和狗的圖像都存到對應文件夾中。
這時候數(shù)據集目錄結構如下
2. 數(shù)據集的導入
在訓練前,先導入訓練集和驗證集。使用keras.preprocessing.image.ImageDataGenerator()做圖像增強的數(shù)據預處理設置,再使用flow_from_directory()從文件路徑中導入數(shù)據集,并設置圖像大小、batch_size和是否shuffle等參數(shù)。
train_datagen = keras.preprocessing.image.ImageDataGenerator(
rescale=1. / 255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest',
)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(width, height),
batch_size=batch_size,
seed=7,
shuffle=True,
class_mode='categorical'
)
valid_datagen = keras.preprocessing.image.ImageDataGenerator(
rescale=1. / 255,
)
valid_generator = valid_datagen.flow_from_directory(
valid_dir,
target_size=(width, height),
batch_size=valid_batch_size,
seed=7,
shuffle=False,
class_mode="categorical"
)
3. 編寫神經網絡結構
編寫一個非?;A的卷積神經網絡
model = keras.models.Sequential([
keras.layers.Conv2D(filters=32, kernel_size=3,
padding='same', activation='relu',
input_shape=[width, height, channel]),
keras.layers.Conv2D(filters=32, kernel_size=3,
padding='same', activation='relu'),
keras.layers.MaxPool2D(pool_size=2),
keras.layers.Conv2D(filters=64, kernel_size=3,
padding='same', activation='relu'),
keras.layers.Conv2D(filters=64, kernel_size=3,
padding='same', activation='relu'),
keras.layers.MaxPool2D(pool_size=2),
keras.layers.Conv2D(filters=128, kernel_size=3,
padding='same', activation='relu'),
keras.layers.Conv2D(filters=128, kernel_size=3,
padding='same', activation='relu'),
keras.layers.MaxPool2D(pool_size=2),
keras.layers.Flatten(),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(num_classes, activation='softmax')
])
model.compile(loss='categorical_crossentropy',
optimizer='adam', metrics=['accuracy'])
model.summary()
優(yōu)化器使用adam,損失函數(shù)使用'categorical_crossentropy' ,metrics參數(shù)填入accuracy,評估模型在訓練和測試過程中的準確率。
4. 模型訓練
訓練模型,設置callbacks,使用model.fit() 開始訓練。
callbacks = [
keras.callbacks.TensorBoard(logdir),
keras.callbacks.ModelCheckpoint(output_model_file,
save_best_only=True,
save_weights_only=True),
keras.callbacks.EarlyStopping(patience=5, min_delta=1e-3)
]
history = model.fit(
train_generator,
epochs=epochs,
validation_data = valid_generator,
callbacks = callbacks
)
訓練100步,看看效果。
由于使用了EarlyStopping,當準確率在幾個epochs內都沒有提高超過一定幅度的話就會停止訓練。由圖可以看出,訓練到40個epoch左右驗證集的準確率達到90%多了。下面是訓練過程的準確率和損失值變化曲線!
5.預測和分類
先讀取文件夾test1中的圖像,使用 model.predict() 進行預測,再根據預測結果把圖像進行分類,分別存儲到 貓 和 狗 的文件夾中。
預測的圖像一共12500張,分類之后兩個文件夾內分別都是6000多張,幾乎持平,分類效果還是不錯的。寫完了這篇,繼續(xù)擼擼貓,繼續(xù)咸魚。
ps: 在本人公眾號回復「貓狗」即可獲取完整代碼。