Keras 为什么验证精度恒定在20%?

Keras 为什么验证精度恒定在20%?,keras,conv-neural-network,Keras,Conv Neural Network,我正在尝试使用Keras实现一个5类动物分类器。我正在从头开始构建CNN,奇怪的是,所有时代的验证精度都保持在0.20。知道为什么会这样吗?数据集文件夹包含训练、测试和验证文件夹。每个文件夹包含对应于5个类的5个文件夹。我做错了什么 我尝试了多个优化器,但问题仍然存在。我已经包括了下面的代码示例 import warnings warnings.filterwarnings("ignore") #First convolution layer model = Sequential() mode

我正在尝试使用Keras实现一个5类动物分类器。我正在从头开始构建CNN,奇怪的是,所有时代的验证精度都保持在0.20。知道为什么会这样吗?数据集文件夹包含训练、测试和验证文件夹。每个文件夹包含对应于5个类的5个文件夹。我做错了什么

我尝试了多个优化器,但问题仍然存在。我已经包括了下面的代码示例

import warnings
warnings.filterwarnings("ignore")

#First convolution layer
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu',kernel_initializer='he_normal',input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))

#Second convolution layer
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu',kernel_initializer='he_normal',input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))

#Flatten the outputs of the convolution layer into a 1D contigious array
model.add(Flatten())

#Add a fully connected layer containing 256 neurons
model.add(Dense(256, activation='relu',kernel_initializer='he_normal'))
model.add(BatchNormalization())

#Add another fully connected layer containing 256 neurons
model.add(Dense(256, activation='relu',kernel_initializer='he_normal'))
model.add(BatchNormalization())

#Add the ouput layer containing 5 neurons, because we have 5 categories
model.add(Dense(5, activation='softmax',kernel_initializer='glorot_uniform'))

optim=RMSprop(lr=1e-6)
model.compile(loss='categorical_crossentropy',optimizer=optim,metrics=['accuracy'])
model.summary()

#We will use the below code snippet for rescaling the images to 0-1 for all the train and test images
train_datagen = ImageDataGenerator(rescale=1./255)

#We won't augment the test data. We will just use ImageDataGenerator to rescale the images.
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(train_data_dir,
                                                    classes=['frog', 'giraffe', 'horse', 'tiger','dog'],
                                                    target_size=(img_width, img_height),
                                                    batch_size=batch_size,
                                                    class_mode='categorical',
                                                    shuffle=False)

validation_generator = test_datagen.flow_from_directory(validation_data_dir,
                                                        classes=['frog', 'giraffe', 'horse', 'tiger','dog'],
                                                        target_size=(img_width, img_height),
                                                        batch_size=batch_size,
                                                        class_mode='categorical',
                                                        shuffle=False)
hist=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,
                    callbacks=[hist])

model.save('models/basic_cnn_from_scratch_model.h5') #Save the model weights #Load using: model = load_model('cnn_from_scratch_weights.h5') from keras.models import load_model
print("Time taken to train the baseline model from scratch: ",datetime.now()-global_start)

看起来你的输出总是同一只动物,因此你有20%的准确率。我强烈建议您检查测试输出,看看它们是否都相同

你还说你在建一个CNN,但是在你发布的代码snipet中,我只看到了密集层,对于一个密集的架构来说,完成这个任务是很困难的,而且它非常小。你的照片有多大


希望有帮助

检查以下数据:

  • 将训练数据洗牌(我到处都能看到
    Shuffle=False
  • 正确地规范化所有数据(我看到您正在执行
    重新缩放=1./255
    ,可能还可以)
  • 正确的列车/货车分离(你似乎也在这样做)
  • 对您的模型的建议:

  • 使用多个
    Conv2D
    层,然后是最后一个
    密集层
    。这是解决图像分类问题的最佳方法。您还可以查看经过尝试和测试的流行体系结构;e、 阿列克斯内特
  • 可以将优化器更改为
    Adam
    ,并尝试使用不同的学习速率
  • 查看您的培训和验证损失图,看看它们是否如预期的那样

  • 另外,我猜您已经纠正了注释中提到的第二个
    Conv2D
    层的形状。

    模型现在似乎正在工作。我已经删除了shuffle=False属性。修正了第二个卷积层的输入形状。将优化器更改为adam。我已经达到了几乎94%的验证准确率。然而,我还没有在看不见的数据上测试该模型。模型中有点过拟合。我将不得不使用一些积极的辍学者来减少他们。谢谢

    尝试将学习率提高到
    1e-2
    1e-3
    。根据数据集的大小和差异,可以将密度降低到128。另外,
    #第二个卷积层
    输入形状必须来自第一个卷积层输出,而不是输入形状本身。我尝试了您提到的两种方法,训练精度提高到90%,但验证精度仍然停留在20%。我还尝试了3个类别,验证准确率保持在33%不变。这和类标签有关吗?你有一个不平衡的数据集吗?像少数派阶级太小了吗?不。数据集是完全平衡的!开始时有两个卷积层,之后有3个致密层。该数据集包含10000张用于培训的图像,2500张用于验证,另外2500张用于测试。这意味着每堂课有2000张图片用于培训,500张图片用于验证和测试。我成功地使用同一数据集的瓶颈特性训练了一个模型。测试准确率为95%。然而,当从零开始训练女修道院时,准确率却停留在20%。图像尺寸是256*256。一定要像其他答案建议的那样使用洗牌。正如我在anwser中所说的,请检查您并非总是输出相同的数字。将优化器更改为adam并稍微提高学习速度。我觉得你的卷积层太少了。从火车和测试损失和敏锐度的一些图表可能是有用的,给你更多的反馈。非常感谢!我会很快给你图形输出。谢谢你的帮助。没问题,我们是来帮忙的!是的,我已经纠正了第二个Conv2D层的形状。在尝试了其他一些事情之后,我今天将提供一个更新。谢谢你的帮助!对将Optimizer更改为adam使其工作!然而,该模型与列车组的匹配度过高。损失值在10个纪元后发散。我将不得不使用一些积极的辍学策略来解决这个问题。你可以在
    密集
    层之间添加
    辍学
    层。顺便说一句,你改变了你模型的架构了吗?