【问题标题】:Transfer Learning using Keras and vgg16 on small dataset在小数据集上使用 Keras 和 vgg16 进行迁移学习
【发布时间】:2019-10-29 21:39:50
【问题描述】:

我必须构建一个可以识别 15 个人脸的神经网络。我正在使用 keras。我的数据集由 300 张图像组成,分为训练、验证和测试。对于 15 个人中的每一个人,我有以下细分:

  • 培训:13
  • 验证:3
  • 测试:4

由于我无法从头开始构建高效的神经网络,我也相信由于我的数据集非常小,我正在尝试通过迁移学习来解决我的问题。我使用了 vgg16 网络。在训练和验证阶段我得到了很好的结果,但是当我运行测试时结果是灾难性的。

我不知道我的问题是什么。这是我使用的代码:

img_width, img_height = 256, 256
train_data_dir = 'dataset_biometria/face/training_set'
validation_data_dir = 'dataset_biometria/face/validation_set'
nb_train_samples = 20   
nb_validation_samples = 20 
batch_size = 16
epochs = 5

model = applications.VGG19(weights = "imagenet", include_top=False, input_shape = (img_width, img_height, 3))

for layer in model.layers:
    layer.trainable = False

#Adding custom Layers 
x = model.output
x = Flatten()(x)
x = Dense(1024, activation="relu")(x)
x = Dropout(0.4)(x)
x = Dense(1024, activation="relu")(x)
predictions = Dense(15, activation="softmax")(x)

# creating the final model 
model_final = Model(input = model.input, output = predictions)

# compile the model 
model_final.compile(loss = "categorical_crossentropy", optimizer = optimizers.SGD(lr=0.0001, momentum=0.9), metrics=["accuracy"])

# Initiate the train and test generators with data Augumentation 
train_datagen = ImageDataGenerator(
rescale = 1./255,
horizontal_flip = True,
fill_mode = "nearest",
zoom_range = 0.3,
width_shift_range = 0.3,
height_shift_range=0.3,
rotation_range=30)

test_datagen = ImageDataGenerator(
rescale = 1./255,
horizontal_flip = True,
fill_mode = "nearest",
zoom_range = 0.3,
width_shift_range = 0.3,
height_shift_range=0.3,
rotation_range=30)

train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size = (img_height, img_width),
batch_size = batch_size, 
class_mode = "categorical")

validation_generator = test_datagen.flow_from_directory(
validation_data_dir,
target_size = (img_height, img_width),
class_mode = "categorical")

# Save the model according to the conditions  
checkpoint = ModelCheckpoint("vgg16_1.h5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)
early = EarlyStopping(monitor='val_acc', min_delta=0, patience=10, verbose=1, mode='auto')


# Train the model 
model_final.fit_generator(
train_generator,
samples_per_epoch = nb_train_samples,
epochs = epochs,
validation_data = validation_generator,
nb_val_samples = nb_validation_samples,
callbacks = [checkpoint, early])

model('model_face_classification.h5')

我也尝试训练一些层而不是不训练任何层,如下例所示:

for layer in model.layers[:10]:
    layer.trainable = False

我还尝试更改 epoch 数、批量大小、nb_validation_samples、nb_validation_sample。

很遗憾结果没有改变,在测试阶段我的网络无法正确识别人脸。

【问题讨论】:

  • 尝试使用 Adam 优化器。 SGD 可以超过最小值或围绕局部最小值振荡。

标签: machine-learning keras neural-network face-recognition


【解决方案1】:

没有看到实际结果或错误,我无法说出问题所在。
当然,小数据集是一个问题,但有很多方法可以解决它。
您可以使用图像增强来增加样本。可以参考augement.py

但不是修改您的上述网络,而是有一个非常酷的模型:siamese network/one-shot learning。它不需要太多的图片,而且准确度很高。

因此,您可以查看以下链接以获得帮助:

  1. Facial-Recognition-Using-FaceNet-Siamese-One-Shot-Learning
  2. Face-recognition-using-deep-learning

【讨论】:

  • 将文件夹或目录路径也放入代码中。此错误表示脚本找不到所需的图像目录
  • 感谢您的建议。我从第一个链接下载了文件夹,安装了所需的软件包,但是当我尝试启动文件 face_recognizer.py 时,终端告诉我: Traceback(最近一次调用最后一次):文件“face_recognizer.py”,第 24 行,在 for image in os.listdir (os.path.join ('images', name)): NotADirectoryError: [Errno 20] Not a directory: 'images / .DS_Store'
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 2019-03-08
  • 2021-09-03
  • 2019-05-07
  • 2020-05-13
  • 2020-10-10
  • 2018-05-11
  • 2023-03-27
相关资源
最近更新 更多