我正在尝试使用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预测?!
我也用验证取代了火车,反之亦然 - 并且得到了同样的问题:培训准确性提高了,而验证准确性却停留在大约0.008 = 1/120 .
任何想法将不胜感激 .
1 回答
我玩了 batch size 并发现batch_size = 120(列车中的目录数以及有效目录)以消除上述问题 . 现在,我可以愉快地使用数据增强技术,而不会使我的Kaggle内核在内存问题上崩溃 . 我还是想知道......
在分类分类模式下,Keras ImageDataGenerator如何从目录中采样图像 - 深度还是广度?
如果深度明智 - 比批量大小为20,它将通过FIRST目录说100张照片(五次),然后移动到下一个目录,分批进行20次,移动到下一个目录...还是广度?
广度 - 最初的20个批次将是前20个目录中的每个目录中的一张照片,然后是接下来的20个目录?我在文档中找不到Keras ImageDataGenerator在与 flow_from _directory 和fit_generator一起使用时如何使用批处理 .