首页 文章

验证准确度低,训练准确性好 - keras imagedatagenerator flow_from_directory分类分类

提问于
浏览
2

我正在尝试使用Keras和ResNet50将Kaggle 10k狗图像分类为120个品种 . 由于Kaggle(14gb ram)的内存限制 - 我必须使用ImageDataGenerator将图像提供给模型,并且还允许实时数据扩充 .

基本复杂的ResNet50型号:

conv_base = ResNet50(weights='imagenet', include_top=False, input_shape=(224,224, 3))

我的模特:

model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(120, activation='softmax'))

确保只有我最后添加的图层是可训练的 - 因此在训练过程和编译模型中不会修改ResNet50原始权重:

conv_base.trainable = False
model.compile(optimizer=optimizers.Adam(), loss='categorical_crossentropy',metrics=['accuracy'])

Num trainable weights BEFORE freezing the conv base: 216
Num trainable weights AFTER freezing the conv base: 4

最后的模型总结:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
resnet50 (Model)             (None, 1, 1, 2048)        23587712  
_________________________________________________________________
flatten_1 (Flatten)          (None, 2048)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 256)               524544    
_________________________________________________________________
dropout_1 (Dropout)          (None, 256)               0         
_________________________________________________________________
dense_2 (Dense)              (None, 120)               30840     
=================================================================
Total params: 24,143,096
Trainable params: 555,384
Non-trainable params: 23,587,712
_________________________________________________________________

火车和验证目录有120个子目录 - 每个狗品种一个 . 在这些文件夹中是狗的图像 . Keras应该使用这些目录来为每个图像获取正确的标签:因此来自“beagle”子目录的图像由Keras自动分类 - 不需要单热编码或类似的东西 .

train_dir = '../input/dogs-separated/train_dir/train_dir/'
validation_dir = '../input/dogs-separated/validation_dir/validation_dir/'

train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
train_dir,target_size=(224, 224),batch_size=20, shuffle=True)
validation_generator = test_datagen.flow_from_directory(
validation_dir,target_size=(224, 224),batch_size=20, shuffle=True)

Found 8185 images belonging to 120 classes.
Found 2037 images belonging to 120 classes.

为了确保这些类是正确的并且按照正确的顺序我比较了他们的train_generator.class_indices和validation_generator.class_indices - 它们是相同的 . 训练模型:

history = model.fit_generator(train_generator,
steps_per_epoch=8185 // 20,epochs=10,
validation_data=validation_generator,
validation_steps=2037 // 20)

请注意,在下面的图表中,虽然训练精度按预期提高了 - 但验证设置在0.008左右,即1/120 ... RANDOM预测?!

enter image description here

enter image description here

我也用验证取代了火车,反之亦然 - 并且得到了同样的问题:培训准确性提高了,而验证准确性却停留在大约0.008 = 1/120 .

任何想法将不胜感激 .

1 回答

  • 0

    我玩了 batch size 并发现batch_size = 120(列车中的目录数以及有效目录)以消除上述问题 . 现在,我可以愉快地使用数据增强技术,而不会使我的Kaggle内核在内存问题上崩溃 . 我还是想知道......

    在分类分类模式下,Keras ImageDataGenerator如何从目录中采样图像 - 深度还是广度?

    如果深度明智 - 比批量大小为20,它将通过FIRST目录说100张照片(五次),然后移动到下一个目录,分批进行20次,移动到下一个目录...还是广度?

    广度 - 最初的20个批次将是前20个目录中的每个目录中的一张照片,然后是接下来的20个目录?我在文档中找不到Keras ImageDataGenerator在与 flow_from _directory 和fit_generator一起使用时如何使用批处理 .

相关问题