# -*- 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
)

代码优化说明:

  1. from...import... 改为 import,例如:from keras.models import Sequential 改为 import keras.models
  2. os.sep 改为 os.path.sep
  3. ImageDataGeneratorfill_mode 改为 'constant'
  4. 将 AlexNet 模型的输出层激活函数改为 'sigmoid'
  5. 优化 Adam 优化器参数,将学习率和 decay 的计算方法改为更合理的公式。
  6. 调整 batch_size 参数,可以根据硬件条件和数据集的大小进行调整。

其他建议:

  1. 可以考虑使用更大型的训练数据集,以提高模型的泛化能力。
  2. 可以尝试使用其他深度学习框架,例如 TensorFlow 或 PyTorch,并进行比较和优化。
  3. 可以根据具体的应用场景,调整模型的架构和超参数,例如增加卷积层或池化层,调整学习率等。

注意:

上述代码优化和建议仅供参考,实际应用中需要根据具体情况进行调整和改进。


原文地址: https://www.cveoy.top/t/topic/ojTs 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录