目录
1.导入包:
import os
import numpy as np
import shutil
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
import matplotlib.pyplot as plt
from IPython.display import Image, display
2. 把猫狗图片分类
2.1下载数据集:train和test1
2.2进行猫狗分类
# 创建分类目录
train_dir = './data/dogs-vs-cats/train'
train_cats_dir = os.path.join(train_dir, 'cats')
train_dogs_dir = os.path.join(train_dir, 'dogs')
# 创建新的分类目录
os.makedirs(train_cats_dir, exist_ok=True)
os.makedirs(train_dogs_dir, exist_ok=True)
# 分类文件
for filename in os.listdir(train_dir):
if filename.startswith('cat.'):
shutil.move(os.path.join(train_dir, filename), os.path.join(train_cats_dir, filename))
elif filename.startswith('dog.'):
shutil.move(os.path.join(train_dir, filename), os.path.join(train_dogs_dir, filename))
3.数据预处理
# 数据目录
train_dir = './data/dogs-vs-cats/train'
test_dir = './data/dogs-vs-cats/test1'
# 图片尺寸
img_size = (128, 128)
batch_size = 32
# 数据生成器
train_datagen = ImageDataGenerator(rescale=1./255, validation_split=0.2)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=img_size,
batch_size=batch_size,
class_mode='binary',
subset='training'
)
validation_generator = train_datagen.flow_from_directory(
train_dir,
target_size=img_size,
batch_size=batch_size,
class_mode='binary',
subset='validation'
)
这一步的运行结果:
4.设计神经网络结构
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 3)),
MaxPooling2D(pool_size=(2, 2)),
# Conv2D(64, (3, 3),
# activation='relu'),
# MaxPooling2D(pool_size=(2, 2)),
Conv2D(128, (3, 3), activation='relu'),
MaxPooling2D(pool_size=(2, 2)),
Flatten(),
Dense(512, activation='relu'),
Dropout(0.5),
Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()
这一步的运行结果:
5.训练模型:
history = model.fit(
train_generator,
steps_per_epoch=train_generator.samples // batch_size,
validation_data=validation_generator,
validation_steps=validation_generator.samples // batch_size,
epochs=8
)
这一步的运行结果:
查看以下数据:
history.history
#查看下训练的数据,这些是会传递到下面的
6.训练结果分析:
def plot_history(history):
#建个窗口
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)#一行两列的第一个
plt.plot(history.history['accuracy'], label='train accuracy')#训练集的
plt.plot(history.history['val_accuracy'], label='val accuracy')#验证集的
plt.title('Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='train loss')
plt.plot(history.history['val_loss'], label='val loss')
plt.title('Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.show()
plot_history(history)
这一步的运行结果:
QAQ我都去掉一层卷积了,等我跑个30次试试看。
7.模型预测:
# 模型预测示例
test_image = tf.keras.preprocessing.image.load_img('./data/dogs-vs-cats/test1/1.jpg', target_size=img_size)
test_image = tf.keras.preprocessing.image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis=0)
test_image /= 255.0
prediction = model.predict(test_image)
if prediction[0] > 0.5:
print("It's a dog!")
else:
print("It's a cat!")
display(Image(filename='./data/dogs-vs-cats/test1/1.jpg'))
这一步的运行结果: