[英]Vgg16 for gender detection (male,female)
我们使用了 vgg16 并冻结了顶层,并在性别数据集 12k 男性和 12k 女性上重新训练了最后 4 层。 它的准确性非常低,尤其是对于男性。 我们正在使用 IMDB 数据集。 在女性测试数据上,它给出的女性为 output,但在男性上,它给出相同的 output。
vgg_conv=VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
Freeze the layers except the last 4 layers
for layer in vgg_conv.layers[:-4]:
layer.trainable = False
Create the model
model = models.Sequential()
Add the vgg convolutional base model
model.add(vgg_conv)
Add new layers
model.add(layers.Flatten())
model.add(layers.Dense(4096, activation='relu'))
model.add(layers.Dense(4096, activation='relu'))
model.add(layers.Dropout(0.5)) model.add(layers.Dense(2, activation='softmax'))
nTrain=16850 nTest=6667
train_datagen = image.ImageDataGenerator(rescale=1./255)
test_datagen = image.ImageDataGenerator(rescale=1./255)
batch_size = 12 batch_size1 = 12
train_generator = train_datagen.flow_from_directory(train_dir, target_size=(224, 224), batch_size=batch_size, class_mode='categorical', shuffle=False)
test_generator = test_datagen.flow_from_directory(test_dir, target_size=(224, 224), batch_size=batch_size1, class_mode='categorical', shuffle=False)
model.compile(optimizer=optimizers.RMSprop(lr=1e-6), loss='categorical_crossentropy', metrics=['acc'])
history = model.fit_generator( train_generator, steps_per_epoch=train_generator.samples/train_generator.batch_size, epochs=3, validation_data=test_generator, validation_steps=test_generator.samples/test_generator.batch_size, verbose=1)
model.save('gender.h5')
测试代码:
model=load_model('age.h5')
img=load_img('9358807_1980-12-28_2010.jpg', target_size=(224,224))
img=img_to_array(img)
img=img.reshape((1,img.shape[0],img.shape[1],img.shape[2]))
img=preprocess_input(img)
yhat=model.predict(img)
print(yhat.size)
label=decode_predictions(yhat)
label=label[0][0]
print('%s(%.2f%%)'% (label[1],label[2]*100))
首先,您将 model 保存为gender.h5
并在测试期间加载 model age.h5
。 可能您在这里添加了不同的测试代码。
来提高程序的准确性 -
loss = 'categorical_crossentropy'
,在model.compile
其更改为loss = 'binary_crossentropy'
因为您只有 2 个类。 所以你的model.compile(optimizer="adam",loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['accuracy'])
看起来像这样。class_mode='categorical'
更改为flow_from_directory
class_mode='binary'
。categorical_crossentropy
与最后一层中的softmax
激活密切相关,如果您将损失更改为binary_crossentropy
,则最后一次激活也应更改为sigmoid
。 所以最后一层应该是Dense(1, activation='sigmoid')
。4096
的Dense
层,这将添加4096 * 4096 = 16,777,216
权重,以便 model 学习。 将它们分别减少到1026
和512
。0.5
的Dropout
层,即在 epoch 期间保持 50% 的神经元关闭。 这是一个巨大的数字。 更好的是放弃Dropout
层并仅在您的 model overfitting
时使用。batch_size = 1
。 由于您的输入非常少,因此每个时期都具有与输入记录相同的步数。ImageDataGenerator
的 Horizo horizontal_flip
、 vertical_flip
、 shear_range
、 zoom_range
等数据增强技术在每个epoch
生成新批次的训练和验证图像。epoch
。 您只是在训练epoch=3
,这对于学习权重来说太少了。 训练epoch=50
,然后修剪数字。希望这能回答你的问题。 快乐学习。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.