Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在训练期间,准确率接近100%,但<;在对图像分类器进行测试/验证期间,50%_Python_Machine Learning_Keras - Fatal编程技术网

Python 在训练期间,准确率接近100%,但<;在对图像分类器进行测试/验证期间,50%

Python 在训练期间,准确率接近100%,但<;在对图像分类器进行测试/验证期间,50%,python,machine-learning,keras,Python,Machine Learning,Keras,在过去的几天里,我一直在尝试训练我的模特,但每次无论我尝试什么,我都会遇到同样的问题。我的准确度一开始很低,在第一个历元内达到90%以上,但每个历元结束时的验证结果介于20-50%之间,对某些类别的模型预测进行测试是准确的,但对大多数类别来说是完全错误的。我的数据集有20000个图像,每个类2000个,和100个测试图像(如果需要,可以获得更多)。我将非常感谢你们的任何意见,因为我对机器学习作为一个整体是非常陌生的,我不完全理解其中的所有内容 我在网上看过几篇描述类似问题及其修复的帖子和文章,无

在过去的几天里,我一直在尝试训练我的模特,但每次无论我尝试什么,我都会遇到同样的问题。我的准确度一开始很低,在第一个历元内达到90%以上,但每个历元结束时的验证结果介于20-50%之间,对某些类别的模型预测进行测试是准确的,但对大多数类别来说是完全错误的。我的数据集有20000个图像,每个类2000个,和100个测试图像(如果需要,可以获得更多)。我将非常感谢你们的任何意见,因为我对机器学习作为一个整体是非常陌生的,我不完全理解其中的所有内容

我在网上看过几篇描述类似问题及其修复的帖子和文章,无论是将激活定义为自己的层而不是参数,添加批量规范化层并更改其动量,尝试几种不同的优化器和学习率,不同大小的数据集,使用自定义初始值设定项,甚至完全更改模型的结构。什么都不管用

以下是网络的主要部分:

model=Sequential()
初始值设定项=keras.initializers.he_normal(种子=无)
model.add(Conv2D(64,(3,3),padding='same',use_bias=False,kernel_initializer=initializer,input_shape=x_train.shape[1:]))
添加(BatchNormalization())
添加(激活('relu'))
add(Conv2D(64,(3,3),padding='same',使用\u bias=False,kernel\u initializer=initializer))
添加(BatchNormalization())
添加(激活('relu'))
add(MaxPooling2D(池大小=(2,2)))
add(Conv2D(128,(3,3),padding='same',使用\u bias=False,kernel\u initializer=initializer))
添加(BatchNormalization())
添加(激活('relu'))
add(Conv2D(128,(3,3),padding='same',使用\u bias=False,kernel\u initializer=initializer))
添加(BatchNormalization())
添加(激活('relu'))
模型。添加(辍学(0.2))
add(MaxPooling2D(池大小=(2,2)))
add(Conv2D(256,(3,3),padding='same',使用\u bias=False,kernel\u initializer=initializer))
添加(BatchNormalization())
添加(激活('relu'))
add(Conv2D(256,(3,3),padding='same',使用\u bias=False,kernel\u initializer=initializer))
添加(BatchNormalization())
添加(激活('relu'))
模型。添加(辍学(0.2))
add(MaxPooling2D(池大小=(2,2)))
model.add(展平())
添加(稠密(2048,使用_bias=False,内核_initializer=initializer))
添加(BatchNormalization())
添加(激活('relu'))
模型。添加(辍学(0.4))
添加(密集(num_类,使用_bias=False))
添加(BatchNormalization())
添加(激活('softmax'))
compile(loss='classifical_crossentropy',optimizer=keras.optimizers.Adam(lr=0.00005),metrics=['accurity']))
#训练模型
如果未测试_模式:
model.fit(x_序列,y_序列,epochs=epochs,batch_size=batch_size,shuffle=True,validation_data=(x_测试,y_测试))
分数=模型。评估(x_测试,y_测试,详细度=0)
打印('测试丢失:',分数[0])
打印('测试精度:',分数[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种不同的手势训练数据集。每个图像都经过了128x128和灰度的预处理,my 100图像测试集是从训练集中的每个类中获取的10幅图像。我知道最好从训练集中单独获取数据进行测试,但我不确定从训练集中删除图像是否是个好主意。这也是我认为这个问题很奇怪的原因之一,因为如果模型过度拟合到训练数据上,那么当面对它已经看到的数据时,为什么精确度如此之低?如果你需要更多的信息,请告诉我

您的模型似乎过于合适,这意味着它正在使[学习]与培训集非常接近


如果您的训练集不包含所有案例类型,则可能会导致这种情况,请再次尝试洗牌数据。

很可能是您的模型拟合过度。这意味着您的模型的预测精度很低,无法推广到训练集之外。可能出现这种情况的原因有很多,因此在我们获得有关您的模型的更多信息之前,无法提出建议

编辑1

我的理解是,模型不应该具有在训练集中发现的测试集观察值。我不太熟悉所使用的语法,但我认为您可以使用
.fit
函数中的
validation\u split
参数来分离集合。建议的比例为85%左右的培训/15%的测试


来源:

当你在训练卷积神经网络(CNN)时,为了消除过度拟合问题,你可以采用以下方法-

  • 您可以使用其概率值来处理辍学者,该概率值充当 CNN正则化器
  • 使用数据增强等技术添加更多数据
  • 使用转移学习(预先培训的模式)

  • 你的模型太合适了!您需要描述培训内容、测试内容、分类值、类值的分布,以及所有其他内容,以获得更有意义的评论。@mattsap的评论是一个良好的开端。如果我正确理解您的编辑#1,您的测试集是否包含在培训集中?我并不认为测试图像存储在单独的位置,但它们都可以在训练集中的某个地方找到。所以,是的。据我所知,这并不好。测试集数据不应该在您的训练集中。那么,我应该创建一个新的测试集,但删除我从训练集中获取的图像吗?我本来打算这样做的,但是似乎参数在训练集洗牌之前从训练集的末尾进行拆分,并且我的训练集加载到ord中