我使用keras并导入具有imagenet权重的VGG16网络以对男性/女性照片进行分类。
目录结构为:
我尝试了在互联网上找到的大多数解决方案,但没有一个起作用:
batch_size
class_mode
/损失功能trainable
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的准确性始终保持“随机”且保持相同(〜50%)。
答案 0 :(得分:1)
尝试降低学习率,在这种情况下,您的模型每次都会超出最小值,因此无法收敛。
如果任何一种超参数调整都不起作用,那么您需要修复数据,但是我认为对于具有预训练权重的CNN模型而言,男性/女性分类数据应该不那么难学习。
答案 1 :(得分:0)
每个班级有多少个样品??? 似乎您没有足够的数据来微调VGG16具有的这些大规模参数。 (如果您可以训练所有层次,则为1.38亿)
我建议: 1.对于性别分类问题,请尝试使用官方数据库,例如IMDB-WIKI 2.如果您想使用自己的数据,请先收集更多标签样本,然后再增加所有样本 3.最后,使用最先进的CNN架构,例如Xception(您可以在keras中加载对xception进行预训练的imagenet)冻结20个第一层并进行其他功能的调整