1. 數據準備
在文件夾下分別建立訓練目錄train,驗證目錄validation,測試目錄test,每個目錄下建立dogs和cats兩個目錄,在dogs和cats目錄下分別放入拍攝的狗和貓的圖片,圖片的大小可以不一樣。
2. 數據讀取
# 存儲數據集的目錄
base_dir = 'E:/python learn/dog_and_cat/data/'
# 訓練、驗證數據集的目錄
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')
print('total training cat images:', len(os.listdir(train_cats_dir)))
print('total training dog images:', len(os.listdir(train_dogs_dir)))
print('total validation cat images:', len(os.listdir(validation_cats_dir)))
print('total validation dog images:', len(os.listdir(validation_dogs_dir)))
3. 模型建立
# 搭建模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu',
input_shape=(150, 150, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
print(model.summary())
model.compile(loss='binary_crossentropy',
optimizer=RMSprop(lr=1e-4),
metrics=['acc'])
4. 模型訓練
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
train_dir, # target directory
target_size=(150, 150), # resize圖片
batch_size=20,
class_mode='binary'
)
validation_generator = test_datagen.flow_from_directory(
validation_dir,
target_size=(150, 150),
batch_size=20,
class_mode='binary'
)
for data_batch, labels_batch in train_generator:
print('data batch shape:', data_batch.shape)
print('labels batch shape:', labels_batch.shape)
break
hist = model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=10,
validation_data=validation_generator,
validation_steps=50
)
model.save('cats_and_dogs_small_1.h5')
5. 模型評估
acc = hist.history['acc']
val_acc = hist.history['val_acc']
loss = hist.history['loss']
val_loss = hist.history['val_loss']
epochs = range(len(acc))
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.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.legend()
plt.show()
6. 預測
imagename = 'E:/python learn/dog_and_cat/data/validation/dogs/dog.2026.jpg'
test_image = image.load_img(imagename, target_size = (150, 150))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis=0)
result = model.predict(test_image)
if result[0][0] == 1:
prediction ='dog'
else:
prediction ='cat'
print(prediction)
代碼在spyder下運行正常,一般情況下,可以將文件分爲兩個部分,一部分爲Train.py,包含深度學習模型建立、訓練和模型的存儲,另一部分Predict.py,包含模型的讀取,評價和預測