Vgg16用于性别检测(男,女)

时间:2019-11-13 11:07:02

标签: python tensorflow deep-learning vgg-net

我们使用了vgg16并冻结了顶层,并在性别数据集12k男性和12k女性上重新训练了最后4层。它的准确性非常低,尤其是对于男性。我们正在使用IMDB数据集。对于女性测试数据,它给出女性作为输出,但是对于男性测试数据,它给出相同的输出。

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))

1 个答案:

答案 0 :(得分:0)

首先,将模型另存为gender.h5,并在测试期间加载模型age.h5。可能您在此处添加了用于测试的其他代码。

要提高程序的准确性-

  1. 最重要的是您正在使用loss = 'categorical_crossentropy',因为只有2个类,所以将其更改为loss = 'binary_crossentropy'中的model.compile。所以你 model.compile(optimizer="adam",loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['accuracy'])将如下所示。
  2. 也将class_mode='categorical'中的class_mode='binary'更改为flow_from_directory
  3. categorical_crossentropy与最后一层的softmax激活并存时,如果将损失更改为binary_crossentropy,则最后一次激活也应更改为sigmoid 。所以最后一层应该是Dense(1, activation='sigmoid')
  4. 您已经添加了Dense的2个4096层,这将添加4096 * 4096 = ‭16,777,216‬权重以供模型学习。将它们减少到1026512
  5. 您已添加Dropout的{​​{1}}层,这是为了在该时期使50%的神经元保持关闭状态。那是巨大的数字。最好是放下0.5层,并仅在模型为Dropout时使用。
  6. 设置overfitting。由于您的输入量非常少,因此每个纪元都具有与输入记录相同的步数。
  7. 使用batch_size = 1中的horizontal_flipvertical_flipshear_rangezoom_range之类的数据增强技术在每个{ {1}}。
  8. 训练模型以获取大量ImageDataGenerator。您只是为epoch训练,对于学习权重而言,这太少了。训练epoch,然后修剪数字。

希望这能回答您的问题。学习愉快。