基于AlexNet的猫狗识别模型训练实战
# -*- coding: utf-8 -*-
import os
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers.convolutional import Conv2D, ZeroPadding2D, MaxPooling2D
from keras.layers.core import Activation, Flatten, Dropout, Dense
from keras.optimizers import Adam
data_dir = 'cats_and_dogs' + os.path.sep + 'image'
train_dir = os.path.join(data_dir, 'train')
test_dir = os.path.join(data_dir, 'test')
# 初始化训练集图像增广生成器
train_datagen = 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='constant'
)
# 初始化验证集图像增广生成器
test_datagen = ImageDataGenerator(rescale=1./255)
# 构建训练数据生成器,输入尺寸为277*277,默认3通道
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(277, 277),
batch_size=32,
class_mode='binary'
)
# 构建验证数据生成器
test_generator = test_datagen.flow_from_directory(
test_dir,
target_size=(277, 277),
batch_size=32,
class_mode='binary'
)
# 构建AlexNet
class AlexNet:
@staticmethod
def build(width, height, depth, classes, reg=None):
model = Sequential()
inputShape = (height, width, depth)
# 第一层卷积和池化
model.add(
Conv2D(
96, (11, 11), input_shape=inputShape,
strides=4, activation='elu'
)
)
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))
# 第二层填充,卷积和池化
model.add(ZeroPadding2D(padding=(2, 2)))
model.add(Conv2D(256, (5, 5), activation='elu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))
# 第三层填充与卷积
model.add(ZeroPadding2D(padding=(1, 1)))
model.add(Conv2D(384, (3, 3), activation='elu'))
# 第四层卷积与填充
model.add(ZeroPadding2D(padding=(1, 1)))
model.add(Conv2D(384, (3, 3), activation='elu'))
# 第五层卷积填充和池化
model.add(ZeroPadding2D(padding=(1, 1)))
model.add(Conv2D(256, (3, 3), activation='elu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))
# 展平操作
model.add(Flatten())
# 第一次全连接
model.add(Dense(4096, activation='elu'))
model.add(Dropout(0.5))
# 第二次全连接
model.add(Dense(4096, activation='elu'))
model.add(Dropout(0.5))
# 输出层
model.add(Dense(classes))
model.add(Activation('sigmoid'))
# 返回模型
return model
# 建立模型结构
# 初始化优化器Adam,实验训练5轮
EPOCHS = 5
le = 4.0001
opt = Adam(lr=le-4, decay=le-4/EPOCHS)
# 实例化模型
model = AlexNet.build(
width=277,
height=277,
depth=3,
classes=1
)
# 配置模型
model.compile(
loss='binary_crossentropy',
optimizer=opt,
metrics=['accuracy']
)
model.summary()
# 训练模型
model.fit_generator(
train_generator,
steps_per_epoch=train_generator.samples // train_generator.batch_size,
epochs=EPOCHS,
validation_data=test_generator,
validation_steps=test_generator.samples // test_generator.batch_size
)
代码优化说明:
- 将
from...import...改为import,例如:from keras.models import Sequential改为import keras.models - 将
os.sep改为os.path.sep - 将
ImageDataGenerator的fill_mode改为'constant' - 将 AlexNet 模型的输出层激活函数改为
'sigmoid' - 优化 Adam 优化器参数,将学习率和 decay 的计算方法改为更合理的公式。
- 调整 batch_size 参数,可以根据硬件条件和数据集的大小进行调整。
其他建议:
- 可以考虑使用更大型的训练数据集,以提高模型的泛化能力。
- 可以尝试使用其他深度学习框架,例如 TensorFlow 或 PyTorch,并进行比较和优化。
- 可以根据具体的应用场景,调整模型的架构和超参数,例如增加卷积层或池化层,调整学习率等。
注意:
上述代码优化和建议仅供参考,实际应用中需要根据具体情况进行调整和改进。
原文地址: https://www.cveoy.top/t/topic/ojTs 著作权归作者所有。请勿转载和采集!