keras-face-recognition icon indicating copy to clipboard operation
keras-face-recognition copied to clipboard

有facenet的keras的训练代码吗?

Open busyyang opened this issue 4 years ago • 27 comments

我看到你直接加载facenet的模型的,你有训练代码吗?用中心损失训练的那种?

busyyang avatar Apr 30 '20 03:04 busyyang

我有,亲

majinmin avatar Sep 14 '20 08:09 majinmin

@busyyang 我有亲

majinmin avatar Sep 14 '20 08:09 majinmin

@majinmin 我看你的git没看到啊.....可以上传一份到git或者分享一下吗

busyyang avatar Sep 14 '20 08:09 busyyang

@busyyang 我用的是triplet loss,官网也有

majinmin avatar Sep 14 '20 08:09 majinmin

@busyyang 想要keras的吗

majinmin avatar Sep 14 '20 09:09 majinmin

是的,keras的,三元损失也行,中心损失也行,那个网站有。

busyyang avatar Sep 14 '20 09:09 busyyang

@busyyang https://github.com/ma1112/keras-triplet-loss

majinmin avatar Sep 14 '20 10:09 majinmin

@majinmin 你模型是怎么构建的,输出什么去用loss训练?你有完整的可以训练的代码吗

busyyang avatar Sep 15 '20 03:09 busyyang

之后会出,你很急么,我还在测试。

bubbliiiing avatar Sep 15 '20 03:09 bubbliiiing

@busyyang 也不是很急,我就是在想facenet的输出层是什么,怎么进行训练,按理说输出就直接是128D的向量,如果用三元损失的话,计算欧氏距离就好了。但用三元损失的话,如果有5000个类别的训练输入,输出层还是128D的向量,那怎么去聚到5000了中心上去啊.......

busyyang avatar Sep 15 '20 04:09 busyyang

@busyyang 不用管类别多少,我发给你的是按批次训练的,你可以看一下原作者的loss的设计过程 image 原文加了 L2层

majinmin avatar Sep 15 '20 05:09 majinmin

@majinmin 我知道,你发那个三元损失的不需要管多少类别。但是用中心损失的话,我觉得还是需要的......

busyyang avatar Sep 15 '20 07:09 busyyang

这个训练过程中不能用‘acc’来表示分类准确率吧,模型输出不是分类结果,但是用了metrics=['acc']居然不报错......两个tensor都不一样长,他是怎么比较的。。。。

busyyang avatar Sep 15 '20 08:09 busyyang

@busyyang 不会报错的,但是也不应该用acc,可以辅助设计交叉熵损失

majinmin avatar Sep 15 '20 10:09 majinmin

@majinmin 我看了acc的核心实现是用的K.equal(y_true, y_pred),自己送两个shape 不一样的tensor就是报错了...... 另外,你给我那个三元损失,我训练CASIA数据集,loss降到1.0000就不动了。。。。。。

busyyang avatar Sep 16 '20 01:09 busyyang

@ busyyang 损失函数发我看看,还有就是网络最后一层加L2_Normal_Layer

majinmin avatar Sep 16 '20 02:09 majinmin

模型加了L2normal了:

def build_model(num_output, input_size):
    base_model = InceptionResNetV2(input_shape=input_size, weights=None)
    _input = base_model.input
    _output = base_model.layers[-2].output
    _output = Dense(num_output, name='output')(_output)
    _output = Lambda(lambda x: K.l2_normalize(x, axis=1), name='l2norm')(_output)
    model = Model(_input, _output)
    model.summary()
    return model

损失函数就是你前面发的那个git的,我把那个py文件复制出来了。

from triplet_loss import batch_hard_triplet_loss as tripletLoss
.....

model.compile(keras.optimizers.Adam(0.01), loss=tripletLoss)

busyyang avatar Sep 16 '20 02:09 busyyang

@busyyang 学习率太高了,1e-4

majinmin avatar Sep 16 '20 02:09 majinmin

@majinmin let me try try.

busyyang avatar Sep 16 '20 02:09 busyyang

@busyyang image

majinmin avatar Sep 16 '20 02:09 majinmin

@busyyang 你这个问题我遇到过,标签形状需要扁平化

majinmin avatar Sep 16 '20 02:09 majinmin

@majinmin 你有研究过中心损失的实现吗,在输出是128D的向量的情况下,如何聚类的。。。。

busyyang avatar Sep 16 '20 02:09 busyyang

@busyyang 1.你那个可以收敛了吗, 2. 中心损失,是已经训练完输出128 的embedding再聚类,还是 啥意思?

majinmin avatar Sep 16 '20 02:09 majinmin

@majinmin 1 改了损失报错了,现在在看是什么问题。 2 中心损失是在训练过程中,不仅输出类与类的间距变大,类内的间距变小。你可以看下中心损失的定义,我不知道是不是我之前的理解有问题,构建模型的时候就是应该多少分类就多少个输出节点,不要管embedding的问题。

busyyang avatar Sep 16 '20 03:09 busyyang

@busyyang tiplet loss 的label 只用于在线样本采样,和中心损失,insight 不一样的

majinmin avatar Sep 16 '20 03:09 majinmin

@busyyang 模型 输出的节点要根据损失是如何设计的,也可以设计多输出,多输出,计算一样的

majinmin avatar Sep 16 '20 03:09 majinmin

对的,我之前应该是搞混了,中心损失的输出层节点就是有多少类就输出多少的。

busyyang avatar Sep 16 '20 06:09 busyyang