Machine learning 基于小数据集的Keras和vgg16迁移学习

Machine learning 基于小数据集的Keras和vgg16迁移学习,machine-learning,keras,neural-network,face-recognition,Machine Learning,Keras,Neural Network,Face Recognition,我必须建立一个能识别15个人脸的神经网络。我在用keras。我的数据集由300张图片组成,分为训练、验证和测试。对于15人中的每一人,我有以下细分: 培训:13 验证:3 测试:4 由于我无法从头构建一个高效的神经网络,我也相信,因为我的数据集非常小,我正试图通过迁移学习来解决我的问题。我使用了vgg16网络。在培训和验证阶段,我得到了很好的结果,但当我运行测试时,结果是灾难性的 我不知道我的问题是什么。以下是我使用的代码: img\u宽度,img\u高度=256,256 train\u d

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

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

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

img\u宽度,img\u高度=256,256
train\u data\u dir='dataset\u biometria/face/training\u set'
验证\u数据\u目录='dataset\u biometria/face/validation\u set'
nb_系列样品=20
nb_验证_样本=20
批量大小=16
纪元=5
model=applications.VGG19(weights=“imagenet”,include_top=False,input_shape=(img_宽度,img_高度,3))
对于model.layers中的图层:
layer.trainable=错误
#添加自定义图层
x=模型输出
x=展平()(x)
x=密集(1024,activation=“relu”)(x)
x=辍学率(0.4)(x)
x=密集(1024,activation=“relu”)(x)
预测=密集(15,activation=“softmax”)(x)
#创建最终模型
模型\最终=模型(输入=模型。输入,输出=预测)
#编译模型
模型_final.compile(loss=“categorical_crossentropy”,optimizer=optimizers.SGD(lr=0.0001,momentum=0.9),度量=[“准确性”])
#使用数据预告启动列车和测试发电机
列车\数据发生器=图像数据发生器(
重新缩放=1./255,
水平翻转=真,
填充模式=“最近”,
缩放范围=0.3,
宽度\偏移\范围=0.3,
高度\位移\范围=0.3,
旋转(范围=30)
test_datagen=ImageDataGenerator(
重新缩放=1./255,
水平翻转=真,
填充模式=“最近”,
缩放范围=0.3,
宽度\偏移\范围=0.3,
高度\位移\范围=0.3,
旋转(范围=30)
train_generator=来自目录的train_datagen.flow_(
列车数据目录,
目标尺寸=(图像高度、图像宽度),
批次大小=批次大小,
class_mode=“分类”)
验证\u生成器=来自\u目录的测试\u datagen.flow\u(
验证\u数据\u目录,
目标尺寸=(图像高度、图像宽度),
class_mode=“分类”)
#根据条件保存模型
检查点=模型检查点(“vgg16\u 1.h5”,监视器=”val\u acc',详细=1,保存最佳值仅=真,保存权重仅=假,模式=”自动',周期=1)
早期=早期停止(监视器='val\u acc',最小增量=0,耐心=10,详细度=1,模式='auto')
#训练模型
型号\最终安装\发电机(
列车发电机,
每个历元的样本数=nb列样本数,
时代,
验证数据=验证生成器,
nb_val_样本=nb_验证_样本,
回调=[checkpoint,early])
模型('model_face_classification.h5')
我还尝试训练一些层,而不是不训练任何层,如下例所示:

模型中图层的
。图层[:10]:
layer.trainable=错误
我还尝试更改了历代的数量、批量大小、nb_验证样本、nb_验证样本


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

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

但除了修改上述网络之外,还有一个非常酷的模式:
暹罗网络/一次性学习
。它不需要太多的图片和精度是伟大的

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


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

    但除了修改上述网络之外,还有一个非常酷的模式:
    暹罗网络/一次性学习
    。它不需要太多的图片和精度是伟大的

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


  • 尝试使用Adam优化器。SGD可以超出最小值,也可以围绕局部最小值振荡。请尝试使用Adam优化器。SGD可以超出最小值,也可以围绕局部最小值振荡。将文件夹或目录路径也放入代码中。此错误意味着脚本无法找到所需的Images目录谢谢您的建议。我从第一个链接下载了文件夹,安装了所需的软件包,但当我尝试启动文件face_recognizer.py时,终端告诉我:回溯(最近一次调用):文件“face_recognizer.py”,第24行,在os.listdir(os.path.join('images',name'):NotADirectoryError:[Errno 20]不是目录:“images/.DS_Store”也将文件夹或目录路径放入代码中。此错误意味着脚本无法找到所需的Images目录谢谢您的建议。我从第一个链接下载了文件夹,安装了所需的软件包,但当我尝试启动文件face_recognizer.py时,终端告诉我:回溯(最近一次调用):文件“face_recognizer.py”,第24行,在os.listdir(os.path.join('images',name'):NotADirectoryError:[Errno 20]不是目录:“images/.DS\u Store”