训练期间的准确度接近100%,但在图像分类器上的测试/验证期间,准确度不到50%

时间:2019-08-01 15:01:37

标签: python machine-learning keras

过去几天,我一直在尝试训练我的模型,但是每次,无论我尝试什么,都会遇到同样的问题。我的准确性开始较低,并在第一个时期内达到90%以上,但每个时期结束时的验证结果介于20%至50%之间,并且测试模型预测对于某些类别是准确的,但对于大多数类别来说是完全错误的。我的数据集有20000张图像,每班2000张图像,以及100张测试图像(如有必要,可以获取更多图像)。我将不胜感激你们中的任何人,因为我对整个机器学习还很陌生,而且我还不完全理解其中的所有内容。

我看了几篇在线文章和文章,描述了类似的问题及其修复方法,是否将激活定义为自己的层而不是参数,添加了批量归一化层并更改了它们的动力,尝试了几种不同的优化器和学习率,不同大小的数据集,使用自定义的初始化程序,甚至完全改变了模型的结构。什么都没有。

这是网络的主要部分:

model = Sequential()
initializer = keras.initializers.he_normal(seed=None)

model.add(Conv2D(64, (3, 3), padding='same', use_bias=False, kernel_initializer=initializer, input_shape=x_train.shape[1:]))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3), padding='same', use_bias=False, kernel_initializer=initializer))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (3, 3), padding='same', use_bias=False, kernel_initializer=initializer))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(128, (3, 3), padding='same', use_bias=False, kernel_initializer=initializer))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(256, (3, 3), padding='same', use_bias=False, kernel_initializer=initializer))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(256, (3, 3), padding='same', use_bias=False, kernel_initializer=initializer))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(2048, use_bias=False, kernel_initializer=initializer))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.4))
model.add(Dense(num_classes, use_bias=False))
model.add(BatchNormalization())
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.Adam(lr=0.00005), metrics=['accuracy'])

# train the model
if not testing_mode:
    model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, shuffle=True, validation_data=(x_test, y_test))

scores = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])

以下是一个时期的最后几批,并在最后进行了验证:

19776/20000 [============================>.] - ETA: 25s - loss: 0.4859 - acc: 0.9707
19840/20000 [============================>.] - ETA: 18s - loss: 0.4855 - acc: 0.9708
19904/20000 [============================>.] - ETA: 11s - loss: 0.4851 - acc: 0.9709
19968/20000 [============================>.] - ETA: 3s - loss: 0.4848 - acc: 0.9710 
20000/20000 [==============================] - 2323s 116ms/step - loss: 0.4848 - acc: 0.9710 - val_loss: 1.9185 - val_acc: 0.5000

编辑:有人告诉我添加有关我的数据集的更多信息。我正在使用10种不同手势的this数据集进行训练。每张图像都经过预处理,以128x128灰度显示,我的100张图像测试集是从训练集中的每个班级拍摄的10张图像。我知道最好获取与训练集分开的数据进行测试,但是我不确定从训练集中删除图像是否是个好主意。这也是我认为这个问题很奇怪的原因之一,因为如果模型过度拟合到训练数据上,那么当面对已经看到的数据时,为什么精度如此之低?让我知道您是否需要更多信息。

3 个答案:

答案 0 :(得分:1)

您的模型似乎过拟合,这意味着它正在非常适应训练集的[学习]。

如果您的训练集未包含所有案例类型,则可能导致这种情况,请尝试重新整理数据。

答案 1 :(得分:1)

您的模型很可能过度拟合。这意味着您的模型的预测准确性较差,并且不能推广超出训练集。发生这种情况的原因有多种,因此,除非我们提供有关您的模型的更多信息,否则无法提出建议。

编辑1

我的理解是,模型不应具有在训练集中找到的测试集观测值。我对所使用的语法不太熟悉,但是我认为您可以使用validation_split函数中的.fit参数来分隔集合。建议的拆分方式是大约85%的培训/ 15%的测试

来源:https://keras.io/models/model/

答案 2 :(得分:0)

在训练卷积神经网络(CNN)时,要摆脱过度拟合的问题,可以应用以下方法-

  1. 您可以使用 Dropout 以及其概率值作为 CNN的正则化器
  2. 使用数据增强
  3. 之类的技术添加更多数据
  4. 使用转移学习(预先训练的模型)