我有一个要训练的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)
答案 0 :(得分:1)
由于某些原因,网络可能无法融合/学习,但这是我认为与您的情况相关的提示列表(根据我的经验):
转移学习:您应该知道的第一件事是,对于大多数问题,从头开始训练图像分类器非常困难,您需要更多的计算能力和时间。我强烈建议您使用转学。 Keras中提供了多种训练有素的体系结构,您可以将它们用作网络的初始权重(或其他方法)。
培训步骤:对于优化工具,我建议先使用Adam,然后更改学习率以了解损失的响应方式。另外,由于您正在使用卷积层,因此应考虑添加批处理归一化层,这可以显着缩短训练时间,并将卷积激活更改为“ relu”,从而使它们的训练速度更快。
您也可以尝试降低Dropout值,但我认为这不是主要问题。另外,如果您正在考虑从头开始培训网络, 您应该从更少的层开始,然后逐渐增加,以更好地了解正在发生的事情。
训练/测试组:我发现您在测试集中使用了8360个观测值。考虑到您的培训课程规模,我认为这太多了。例如1000就足够了。您拥有的培训样本越多,您的结果就会越令人满意。
此外,在判断模型的准确性之前,您应该首先建立一个基准模型来对模型进行基准测试。基线模型取决于您的问题,但总的来说,我选择一种模型来预测数据集中最常见的类。您还应该查看Keras中可用的另一个度量“ top_k_accuracy”,当您要预测的类别相对较多时,这很有趣。它可以帮助您了解模型与正确的预测有多接近。
答案 1 :(得分:0)
首先,为了保持理智,请仔细检查是否有任何错误,以及是否按计划发送了数据
您可能想添加Top K准确性度量标准,以更好地了解它是接近实现还是完全错误。
这里有一些调整的尝试:
将内核大小更改为3,并激活为relu
model.add(Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'))
如果您认为模型不合适,请尝试从每个池开始增加Conv层数。但是您也可以增加过滤器数量或conv +池重复次数。
Adam优化程序的学习速度可能比RMS属性快
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
最大的改进可能是获取更多数据。我认为您的数据集对于问题的范围可能太小了。 您可能要尝试从预先训练的图像识别网络进行转移学习。