Keras 不使用 fit_generator() 进行训练

2024-02-05

我正在使用 Keras 2.0.4(TensorFlow 后端)执行图像分类任务。 我正在尝试训练我自己的网络(没有任何预训练参数)。 由于我的数据很大,我无法将所有数据加载到内存中。 为此我使用ImageDataGenerator(), flow_from_directory() and fit_generator().

创造ImageDataGenerator object:

train_datagen = ImageDataGenerator(preprocessing_function = my_preprocessing_function) # only preprocessing; no augmentation; static data set

my_preprocessing_function 将图像重新缩放到域 [0,255] 并通过均值缩减将数据居中(类似于 VGG16 或 VGG19 的预处理)

使用方法flow_from_directory()来自ImageDataGenerator object:

train_generator = train_datagen.flow_from_directory(
    path/to/training/directory/with/five/subfolders,
    target_size=(img_width, img_height),
    batch_size=64,
    classes = ['class1', 'class2', 'class3', 'class4', 'class5'],
    shuffle = True,
    seed = 1337,
    class_mode='categorical')

(同样的操作也是为了创建一个validation_generator。)

定义并编译模型后(损失函数:categorical crossentropy,优化器:Adam),我使用训练模型fit_generator():

model.fit_generator(
    train_generator,
    steps_per_epoch=total_amount_of_train_samples/batch_size,
    epochs=400,
    validation_data=validation_generator,
    validation_steps=total_amount_of_validation_samples/batch_size)

Problem:
没有错误消息,但训练效果不佳。 经过 400 个 epoch 后,准确率仍然在 20% 左右波动(这与随机选择其中一个类别一样好)。事实上,分类器总是预测“class1”。 仅经过一个时期的训练后,情况也是如此。尽管我正在初始化随机权重,但为什么会出现这种情况? 怎么了?我缺少什么?

使用型号

x = Input(shape=input_shape)

# Block 1
x = Conv2D(16, (3, 3), activation='relu', padding='same', name='block1_conv1')(x)
x = Conv2D(16, (5, 5), activation='relu', padding='same', name='block1_conv2')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(x)

# Block 2
x = Conv2D(64, (3, 3), activation='relu', padding='same', name='block2_conv1')(x)
x = Conv2D(64, (5, 5), activation='relu', padding='same', name='block2_conv2')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(x)

# Block 3
x = Conv2D(16, (1, 1), activation='relu', padding='same', name='block3_conv1')(x)

# Block 4
x = Conv2D(256, (3, 3), activation='relu', padding='valid', name='block4_conv1')(x)
x = Conv2D(256, (5, 5), activation='relu', padding='valid', name='block4_conv2')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(x)

# Block 5
x = Conv2D(1024, (3, 3), activation='relu', padding='valid', name='block5_conv1')(x)
x = MaxPooling2D((2, 2), strides=(2, 2), name='block5_pool')(x)

# topping 
    x = Dense(1024, activation='relu', name='fc1')(x)
    x = Dense(1024, activation='relu', name='fc2')(x)
predictions = Dense(5, activation='softmax', name='predictions')(x)

E D I T
terminal output
terminal log


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keras 不使用 fit_generator() 进行训练 的相关文章

随机推荐