Python 为什么会有';当数据集';s用于验证和培训?

Python 为什么会有';当数据集';s用于验证和培训?,python,tensorflow,keras,Python,Tensorflow,Keras,我用ResNet50训练了一个模型,在训练集上获得了95%的惊人准确率。 我用同样的训练集进行了验证,结果准确性似乎很差。(您以不同的方式分配了train_set和test_datagen。特别是其中一个被翻转和缩放,而另一个则没有。正如我在评论中提到的,如果数据相同,那么它将具有相同的精度。当您正确使用验证并使用看不见的数据进行验证时,您可以看到模型拟合过度。使用相同的数据总是会产生错误培训和验证的精度相同不确定到底是什么错误,但这不是一个过度拟合的问题。很明显,您的验证数据(与培训数据相同)

我用ResNet50训练了一个模型,在训练集上获得了95%的惊人准确率。
我用同样的训练集进行了验证,结果准确性似乎很差。(您以不同的方式分配了train_set和test_datagen。特别是其中一个被翻转和缩放,而另一个则没有。正如我在评论中提到的,如果数据相同,那么它将具有相同的精度。当您正确使用验证并使用看不见的数据进行验证时,您可以看到模型拟合过度。使用相同的数据总是会产生错误培训和验证的精度相同

不确定到底是什么错误,但这不是一个过度拟合的问题。很明显,您的验证数据(与培训数据相同)没有正确输入。首先,您将验证批大小设置为1,但将验证步骤设置为validation\u steps=test\u generator.samples//31)。如果test_generator,samples=1488,则您有48个步骤,但批大小为1时,您将仅验证48个样本。您希望设置批大小和步骤,以便批大小X验证步骤等于样本总数。这样,您只需通过验证集一次。我还建议您在测试生成器中使用t shuffle=False。另外,为什么还要麻烦输入所有类名。如果您的类目录被标记为“飞机”、“机场”、“棒球钻石”等,那么您不需要专门定义类,从目录流出的类将自动为您定义。请参阅下面的文档

类:类子目录的可选列表(例如,.[dogs'、[cats'])。默认值:无。如果未提供,则将根据目录下的子目录名称/结构自动推断类列表,其中每个子目录将被视为不同的类(映射到标签索引的类的顺序将是字母数字的)。包含从类名到类索引的映射的字典可以通过属性class_索引获得


您的培训数据实际上不同于您的测试数据,因为您在生成器中使用的是数据增强。这没关系,它可能会导致您的测试和验证精度之间存在微小差异,但一旦您正确输入验证数据,您的验证精度应该非常接近。

您不应该在生成器中使用相同的数据r培训和验证,这打破了验证的概念,试图找出你的模型概括得有多好。请发布一个可复制的example@Alistair谢谢你的回复!这只是一个实验。只是试图理解当使用相同的数据集作为验证时,精度低的原因。如果是相同的,那么精度应该是相同的同样的数据。这可能是因为code@Alistair不,请检查代码。这个问题可能是由于我在互联网上读到的各种博客文章过多造成的。但我希望从这里的任何人那里找到一些直观的解释。@Samuel Liew♦ 我请求你重新打开这个问题。嘿@Gerry P,谢谢你的回答!是的,我想将批量大小设置为1。因为我在玩游戏,我尝试了各种不同的方法,但没有获得很好的准确性。因此,我在这里做了一些更改。正如你指出的,我将测试集中的批量大小更改为31,这次是在验证步骤中,它涵盖了每个时代验证期间的全部1488张图像。如果你有1448张图像和31个类,那么请你看看这个colab笔记本,平均每个类大约有47张图像。即使你在图像生成器中进行了增强,我也怀疑47张图像是否足够大以捕获全部概率类的分布。因此,您将获得较高的训练精度,但验证精度较低。目前我的建议是收集更多图像。尝试每个类至少获得100个图像。如果可能,通过每个类具有非常接近相同数量的图像来保持数据集的平衡。我怀疑该模型是否正确是不是太夸张了?每个类有48张图片…总共1488张图片
from keras.preprocessing.image import ImageDataGenerator

train_set = ImageDataGenerator(horizontal_flip=True,rescale=1./255,shear_range=0.2,zoom_range=0.2).flow_from_directory(data,target_size=(256,256),classes=['airplane','airport','baseball_diamond',
                                                                    'basketball_court','beach','bridge',
                                                                  'chaparral','church','circular_farmland',
                                                                  'commercial_area','dense_residential','desert',
                                                                  'forest','freeway','golf_course','ground_track_field',
                                                                  'harbor','industrial_area','intersection','island',
                                                                  'lake','meadow','medium_residential','mobile_home_park',
                                                                  'mountain','overpass','parking_lot','railway','rectangular_farmland',
                                                                  'roundabout','runway'],batch_size=31)
from keras.applications import ResNet50 
from keras.applications.resnet50 import preprocess_input
from keras import layers,Model

conv_base = ResNet50(
    include_top=False,
    weights='imagenet')


for layer in conv_base.layers:
    layer.trainable = False

x = conv_base.output
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dense(128, activation='relu')(x) 
predictions = layers.Dense(31, activation='softmax')(x)
model = Model(conv_base.input, predictions)
# here you will write the path for train data or if you create your val data then you can test using that too. 
# test_dir = ""
test_datagen = ImageDataGenerator(rescale=1. / 255) 
test_generator = test_datagen.flow_from_directory( 
    data, 
    target_size=(256, 256), classes=['airplane','airport','baseball_diamond',
                                                                    'basketball_court','beach','bridge',
                                                                  'chaparral','church','circular_farmland',
                                                                  'commercial_area','dense_residential','desert',
                                                                  'forest','freeway','golf_course','ground_track_field',
                                                                  'harbor','industrial_area','intersection','island',
                                                                  'lake','meadow','medium_residential','mobile_home_park',
                                                                  'mountain','overpass','parking_lot','railway','rectangular_farmland',
                                                                  'roundabout','runway'],batch_size=1,shuffle=True)
model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy'])
model.fit_generator(train_set,steps_per_epoch=1488//31,epochs=10,verbose=True,validation_data = test_generator, 
Epoch 1/10
48/48 [==============================] - 27s 553ms/step - loss: 1.9631 - acc: 0.4825 - val_loss: 4.3134 - val_acc: 0.0208
Epoch 2/10
48/48 [==============================] - 22s 456ms/step - loss: 0.6395 - acc: 0.8212 - val_loss: 4.7584 - val_acc: 0.0833
Epoch 3/10
48/48 [==============================] - 23s 482ms/step - loss: 0.4325 - acc: 0.8810 - val_loss: 5.3852 - val_acc: 0.0625
Epoch 4/10
48/48 [==============================] - 23s 476ms/step - loss: 0.2925 - acc: 0.9153 - val_loss: 6.0963 - val_acc: 0.0208
Epoch 5/10
48/48 [==============================] - 23s 477ms/step - loss: 0.2275 - acc: 0.9341 - val_loss: 5.6571 - val_acc: 0.0625
Epoch 6/10
48/48 [==============================] - 23s 478ms/step - loss: 0.1855 - acc: 0.9489 - val_loss: 6.2440 - val_acc: 0.0208
Epoch 7/10
48/48 [==============================] - 23s 483ms/step - loss: 0.1704 - acc: 0.9543 - val_loss: 7.4446 - val_acc: 0.0208
Epoch 8/10
48/48 [==============================] - 23s 487ms/step - loss: 0.1828 - acc: 0.9476 - val_loss: 7.5198 - val_acc: 0.0417