tensorflow - 为什么我的神经网络不学习
问题描述
我有一个我正在尝试训练的 CNN,但我无法弄清楚它为什么不学习。它有 32 个类,每个文件夹中有大约 1000 张图像的不同类型的衣服。
问题是这是训练结束时的结果,在我的 GPU 上大约需要 9 个小时
损失:3.3403-acc:0.0542-val_loss:3.3387-val_acc:0.0534
如果有人能指导我如何让这个网络更好地训练,我将不胜感激。
# dimensions of our images.
img_width, img_height = 228, 228
train_data_dir = 'Clothes/train'
validation_data_dir = 'Clothes/test'
nb_train_samples = 25061
nb_validation_samples = 8360
epochs = 20
batch_size = 64
if K.image_data_format() == 'channels_first':
input_shape = (3, img_width, img_height)
else:
input_shape = (img_width, img_height, 3)
model = Sequential()
model.add(Conv2D(filters=64, kernel_size=2, padding='same', activation='tanh', input_shape=input_shape))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.3))
model.add(Conv2D(filters=32, kernel_size=2, padding='same', activation='tanh'))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.3))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(32, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
train_datagen = ImageDataGenerator(
rescale=1. / 255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
[test_datagen = ImageDataGenerator(rescale=1. / 255)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical',
shuffle = True)
validation_generator = test_datagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical',
shuffle = True)
history = model.fit_generator(
train_generator,
steps_per_epoch=nb_train_samples // batch_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=nb_validation_samples // batch_size)
解决方案
由于多种原因,网络可能无法融合/学习,但这里列出了我认为与您的案例相关的提示(根据我自己的经验):
迁移学习:您应该知道的第一件事是,对于大多数问题,从头开始训练图像分类器非常困难,您需要更多的计算能力和时间。我强烈推荐使用迁移学习。Keras 中有多种训练有素的架构,您可以将它们用作网络(或其他方法)的初始权重。
训练步骤:对于优化器,我建议先使用 Adam 并改变学习率以查看损失如何响应。此外,由于您使用的是卷积层,您应该考虑添加批量归一化层,这可以显着加快训练时间,并将卷积激活更改为“relu”,这使得它们的训练速度更快。
您也可以尝试降低 Dropout 值,但我认为这不是这里的主要问题。此外,如果您正在考虑从头开始训练您的网络,您应该从较少的层开始,然后逐渐添加更多以更好地了解正在发生的事情。
训练/测试拆分:我看到您在测试集中使用了 8360 个观察值。鉴于您的训练集的大小,我认为它太多了。例如1000就足够了。您拥有的训练样本越多,您的结果就越令人满意。
此外,在判断模型的准确性之前,您应该首先建立一个基线模型来对您的模型进行基准测试。基线模型取决于您的问题,但通常我选择一个模型来预测数据集中最常见的类。您还应该查看 Keras 中可用的另一个指标“top_k_accuracy”,当您要预测的类数量相对较多时,这很有趣。它可以帮助您了解您的模型与正确预测的接近程度。
推荐阅读
- deeplearning4j - 使用 factorMatrix 设置线性回归 - DL4j
- r - 通过名称中的正则表达式对数据框进行排序
- c# - 将创建加密密钥的 PHP 代码转换为 c# MD5
- python - 将数据帧格式化为等长时间序列格式
- ios - 将非续订创建的交易与已完成的交易相关联
- javascript - 是否可以混合捆绑模块和 JavaScript 模块
- css - 有什么技术可以用来保留旧样式并在 Web 表单中应用新样式?
- python - 在python中检查多个数据帧中的空值
- php - 如何将 HTTP 替换为 HTTPS 以确保页面安全
- mysql - 条件成立时使用增量值更新列