Python 用于性别检测的Vgg16(男性、女性)

Python 用于性别检测的Vgg16(男性、女性),python,tensorflow,deep-learning,vgg-net,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

我们使用了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))

首先,您将模型保存为
gender.h5
,并在测试期间加载模型
age.h5
。可能您在这里为测试添加了不同的代码

来提高程序的准确性-

  • 最重要的是,您正在使用
    loss='categorical\u crossentropy'
    ,将其更改为
    model中的
    loss='binary\u crossentropy'
    。编译
    ,因为您只有两个类。那么你的
    
    model.compile(optimizer=“adam”,loss=tf.keras.loss.BinaryCrossentropy(from_logits=True),metrics=['accurity'])
    如下所示
  • 同时将
    flow\u目录中的
    class\u mode='classifical'
    更改为
    class\u mode='binary'
  • 由于
    category\u crossentropy
    与最后一层中的
    softmax
    激活密切相关,如果您将损失更改为
    binary\u crossentropy
    则最后一次激活也应更改为
    sigmoid
    。所以最后一层应该是
    密集的(1,activation='sigmoid')
  • 您已经添加了两层
    4096
    ,这将添加
    4096*4096=‭16,777,216‬模型学习的权重。将它们分别减少到
    1026
    512
  • 您添加了
    Dropout
    0.5
    ,即在新纪元期间保持50%的神经元关闭。这是一个巨大的数字。更好的方法是去掉
    下拉列表
    层,仅当您的模型
    过拟合时才使用
  • 设置
    batch\u size=1
    。由于您的输入非常少,所以让每个历元具有与输入记录相同的步数
  • 使用数据增强技术,如
    ImageDataGenerator的
    水平翻转
    垂直翻转
    剪切范围
    缩放范围
    ,在每个
    纪元
    期间生成新批次的训练和验证图像
  • 为大量的
    epoch
    培训您的模型。您只是在为
    epoch=3
    进行训练,这对于学习权重来说太少了。训练
    epoch=50
    ,然后调整号码

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

    首先,您将模型保存为
    gender.h5
    ,并在测试期间加载模型
    age.h5
    。可能您在这里为测试添加了不同的代码

    来提高程序的准确性-

  • 最重要的是,您正在使用
    loss='categorical\u crossentropy'
    ,将其更改为
    model中的
    loss='binary\u crossentropy'
    。编译
    ,因为您只有两个类。那么你的
    
    model.compile(optimizer=“adam”,loss=tf.keras.loss.BinaryCrossentropy(from_logits=True),metrics=['accurity'])
    如下所示
  • 同时将
    flow\u目录中的
    class\u mode='classifical'
    更改为
    class\u mode='binary'
  • 由于
    category\u crossentropy
    与最后一层中的
    softmax
    激活密切相关,如果您将损失更改为
    binary\u crossentropy
    则最后一次激活也应更改为
    sigmoid
    。所以最后一层应该是
    密集的(1,activation='sigmoid')
  • 您已经添加了两层
    4096
    ,这将添加
    4096*4096=‭16,777,216‬模型学习的权重。将它们分别减少到
    1026
    512
  • 您添加了
    Dropout
    0.5
    ,即在新纪元期间保持50%的神经元关闭。这是一个巨大的数字。更好的方法是去掉
    下拉列表
    层,仅当您的模型
    过拟合时才使用
  • 设置
    batch\u size=1
    。由于您的输入非常少,所以让每个历元具有与输入记录相同的步数
  • 使用数据增强技术,如
    ImageDataGenerator的
    水平翻转
    垂直翻转
    剪切范围
    缩放范围
    ,在每个
    纪元
    期间生成新批次的训练和验证图像
  • 为大量的
    epoch
    培训您的模型。您只是在为
    epoch=3
    进行训练,这对于学习权重来说太少了。训练
    epoch=50
    ,然后调整号码

  • 希望这能回答你的问题。快乐学习。

    你应该重新缩进你的预测代码以提高可读性。问题是它预测女性为女性,但男性也为女性。你应该重新缩进预测代码以提高可读性。问题是它预测女性为女性,但男性也为女性。