flow_from_directory val_acc 未上升的 Keras VGG16
Keras VGG16 with flow_from_directory val_acc not rising
我使用 keras 并导入具有 imagenet 权重的 VGG16 网络对 male/female 张照片进行分类。
目录结构为:
- split_1/train/male/*.jpg
- split_1/train/female/*.jpg
- split_1/val/female/*.jpg
- split_1/val/male/*.jpg
我尝试了我在互联网上找到的大部分解决方案,但 none 有效:
- 改变
batch_size
- 改变优化器
- 改变
class_mode
/损失函数
- 将每一层设置为
trainable
- 将每一层从 VGG 复制到我的序列
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications
[...]
img_width, img_height = 224, 224
top_model_weights_path = "%s_retry2.h5" % split
train_data_dir = "%s/train" % split
validation_data_dir = "%s/val" % split
batch_size = 48
nb_train_samples = 4000
nb_validation_samples = ( 299 // batch_size ) * batch_size
epochs = 5
def train_top_model():
datagen = ImageDataGenerator(
horizontal_flip=True,
shear_range=0.2,
rescale=1. / 255)
vdatagen = ImageDataGenerator(rescale=1./255)
traingen = datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical',
follow_links=True,
shuffle=True)
valgen = vdatagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical',
follow_links=True,
shuffle=True)
vgg_model = applications.VGG16(input_shape=(224,224,3), weights="imagenet", include_top=False)
model = Sequential()
model.add(vgg_model)
model.add(Flatten())
model.add(Dense(2, activation='softmax'))
model.compile(optimizer="rmsprop", loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit_generator(traingen,
epochs=epochs,
steps_per_epoch=nb_train_samples // batch_size,
validation_data=valgen,
validation_steps=nb_validation_samples // batch_size)
它会报告实际的图像数量,以便正确找到 jpg。
在整个训练过程中,val 的准确度保持 "random" 和相同 (~50%)。
尝试降低学习率,可能是您的模型每次都超过最小值,因此无法收敛。
如果任何一种超参数调整都不起作用,那么您需要修复数据,但我认为 male/female 分类数据对于具有 [=15= 的 CNN 模型来说不应该那么难学] 权重。
每个 class 你有多少样本???
您似乎没有足够的数据来微调 VGG16 具有的这些大规模参数。 (如果你可以训练所有层,则为 1.38 亿)
我建议:
1.对于性别class化问题,尽量使用官方数据集如IMDB-WIKI
2. 如果您想使用自己的数据,请先收集更多标签样本,然后再扩充所有样本
3. 最后,使用最先进的 CNN 架构,例如 Xception(您可以在 keras 中加载 xception 的 imagenet pre-traind)冻结 20 个第一层并 fune 调整其他层
我使用 keras 并导入具有 imagenet 权重的 VGG16 网络对 male/female 张照片进行分类。
目录结构为:
- split_1/train/male/*.jpg
- split_1/train/female/*.jpg
- split_1/val/female/*.jpg
- split_1/val/male/*.jpg
我尝试了我在互联网上找到的大部分解决方案,但 none 有效:
- 改变
batch_size
- 改变优化器
- 改变
class_mode
/损失函数 - 将每一层设置为
trainable
- 将每一层从 VGG 复制到我的序列
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
from keras import applications
[...]
img_width, img_height = 224, 224
top_model_weights_path = "%s_retry2.h5" % split
train_data_dir = "%s/train" % split
validation_data_dir = "%s/val" % split
batch_size = 48
nb_train_samples = 4000
nb_validation_samples = ( 299 // batch_size ) * batch_size
epochs = 5
def train_top_model():
datagen = ImageDataGenerator(
horizontal_flip=True,
shear_range=0.2,
rescale=1. / 255)
vdatagen = ImageDataGenerator(rescale=1./255)
traingen = datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical',
follow_links=True,
shuffle=True)
valgen = vdatagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical',
follow_links=True,
shuffle=True)
vgg_model = applications.VGG16(input_shape=(224,224,3), weights="imagenet", include_top=False)
model = Sequential()
model.add(vgg_model)
model.add(Flatten())
model.add(Dense(2, activation='softmax'))
model.compile(optimizer="rmsprop", loss='categorical_crossentropy', metrics=['accuracy'])
history = model.fit_generator(traingen,
epochs=epochs,
steps_per_epoch=nb_train_samples // batch_size,
validation_data=valgen,
validation_steps=nb_validation_samples // batch_size)
它会报告实际的图像数量,以便正确找到 jpg。 在整个训练过程中,val 的准确度保持 "random" 和相同 (~50%)。
尝试降低学习率,可能是您的模型每次都超过最小值,因此无法收敛。
如果任何一种超参数调整都不起作用,那么您需要修复数据,但我认为 male/female 分类数据对于具有 [=15= 的 CNN 模型来说不应该那么难学] 权重。
每个 class 你有多少样本??? 您似乎没有足够的数据来微调 VGG16 具有的这些大规模参数。 (如果你可以训练所有层,则为 1.38 亿)
我建议: 1.对于性别class化问题,尽量使用官方数据集如IMDB-WIKI 2. 如果您想使用自己的数据,请先收集更多标签样本,然后再扩充所有样本 3. 最后,使用最先进的 CNN 架构,例如 Xception(您可以在 keras 中加载 xception 的 imagenet pre-traind)冻结 20 个第一层并 fune 调整其他层