wotchin / SmooFaceEngine

A high-performance demo for face recognition based on deep learning.
Apache License 2.0
108 stars 54 forks source link

关于代码中的一些问题 #21

Closed misszhucanjie closed 2 years ago

misszhucanjie commented 2 years ago

尊敬的作者: 您好。 关于书中的代码,我有一些疑问,想问下您,其中包括代码运行中的错误,以及关于人脸识别中技术的使用。

  1. 我在运行代码时候使用的版本为TensorFlow2.3,运行之后报没有梯度的关系,我暂时猜测是因为输入的数据与之后损失函数之间没有关系。报错如下: ValueError: No gradients provided for any variable: ['conv1/kernel:0', 'conv1/bias:0', 'batch_normalization/gamma:0',(未复制完全,每一层网络都没有梯度) Traceback (most recent call last): File "E:/code_myself/learning_information/1advance_sample/oppo_adv/pytorch_learning/face_net/SmooFaceEngine-master/train.py", line 64, in validation_steps=int((validation_set_size) / batch_size)
  2. 这一点是关于使用的模型,在看您代码中使用的是resnet网络进行分类,但是现在人脸识别,我看的论文主要使用的是特征提取,像您书中提到的goolenet,他们都是通过一个神经网络,facenet网络,将输入的照片提取出一个1*512的特征向量,通过特征向量之间的余弦相似度,判断是否为一个人,如果使用这种网络,他在训练过程中是否跟您rstnet网络一样,使用amsoftmax_loss损失函数呢?
wotchin commented 2 years ago

你好。

  1. 关于第一个问题,我在本地代码中没有复现。由于没有测试过tensorflow2.3, 因此猜测可能是keras 与 tf的版本适配问题。不知道使用的是哪个分支。如果是master 分支,则可尝试使用 tensorflow2.0.0+ 分支;如还不能解决,可以尝试改用推荐版本;
  2. ResNet在训练时,改用AM损失函数,与使用预先相似度并不冲突。也就是说,如果我们最后想要用余弦相似度来衡量人脸之间的“距离”,改用这种损失函数会优于默认的softmax损失函数。类似的还有SphereFace网络,也都是类似的原理。
wotchin commented 2 years ago

btw, goolenet 等网络也都可以跟resnet一样,改用AM损失函数,网络结构的不同和损失函数的不同一般不冲突,是可解耦的。