我们使用了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))
答案 0 :(得分:0)
首先,将模型另存为gender.h5
,并在测试期间加载模型age.h5
。可能您在此处添加了用于测试的其他代码。
要提高程序的准确性-
loss = 'categorical_crossentropy'
,因为只有2个类,所以将其更改为loss = 'binary_crossentropy'
中的model.compile
。所以你
model.compile(optimizer="adam",loss=tf.keras.losses.BinaryCrossentropy(from_logits=True), metrics=['accuracy'])
将如下所示。 class_mode='categorical'
中的class_mode='binary'
更改为flow_from_directory
。categorical_crossentropy
与最后一层的softmax
激活并存时,如果将损失更改为binary_crossentropy
,则最后一次激活也应更改为sigmoid
。所以最后一层应该是Dense(1, activation='sigmoid')
。Dense
的2个4096
层,这将添加4096 * 4096 = 16,777,216
权重以供模型学习。将它们减少到1026
和512
。Dropout
的{{1}}层,这是为了在该时期使50%的神经元保持关闭状态。那是巨大的数字。最好是放下0.5
层,并仅在模型为Dropout
时使用。overfitting
。由于您的输入量非常少,因此每个纪元都具有与输入记录相同的步数。batch_size = 1
中的horizontal_flip
,vertical_flip
,shear_range
,zoom_range
之类的数据增强技术在每个{ {1}}。ImageDataGenerator
。您只是为epoch
训练,对于学习权重而言,这太少了。训练epoch
,然后修剪数字。希望这能回答您的问题。学习愉快。