keras-face-recognition
keras-face-recognition copied to clipboard
有facenet的keras的训练代码吗?
我看到你直接加载facenet的模型的,你有训练代码吗?用中心损失训练的那种?
我有,亲
@busyyang 我有亲
@majinmin 我看你的git没看到啊.....可以上传一份到git或者分享一下吗
@busyyang 我用的是triplet loss,官网也有
@busyyang 想要keras的吗
是的,keras的,三元损失也行,中心损失也行,那个网站有。
@busyyang https://github.com/ma1112/keras-triplet-loss
@majinmin 你模型是怎么构建的,输出什么去用loss训练?你有完整的可以训练的代码吗
之后会出,你很急么,我还在测试。
@busyyang 也不是很急,我就是在想facenet的输出层是什么,怎么进行训练,按理说输出就直接是128D的向量,如果用三元损失的话,计算欧氏距离就好了。但用三元损失的话,如果有5000个类别的训练输入,输出层还是128D的向量,那怎么去聚到5000了中心上去啊.......
@busyyang 不用管类别多少,我发给你的是按批次训练的,你可以看一下原作者的loss的设计过程
原文加了 L2层
@majinmin 我知道,你发那个三元损失的不需要管多少类别。但是用中心损失的话,我觉得还是需要的......
这个训练过程中不能用‘acc’来表示分类准确率吧,模型输出不是分类结果,但是用了metrics=['acc']居然不报错......两个tensor都不一样长,他是怎么比较的。。。。
@busyyang 不会报错的,但是也不应该用acc,可以辅助设计交叉熵损失
@majinmin 我看了acc的核心实现是用的K.equal(y_true, y_pred),自己送两个shape 不一样的tensor就是报错了...... 另外,你给我那个三元损失,我训练CASIA数据集,loss降到1.0000就不动了。。。。。。
@ busyyang 损失函数发我看看,还有就是网络最后一层加L2_Normal_Layer
模型加了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 学习率太高了,1e-4
@majinmin let me try try.
@busyyang
@busyyang 你这个问题我遇到过,标签形状需要扁平化
@majinmin 你有研究过中心损失的实现吗,在输出是128D的向量的情况下,如何聚类的。。。。
@busyyang 1.你那个可以收敛了吗, 2. 中心损失,是已经训练完输出128 的embedding再聚类,还是 啥意思?
@majinmin 1 改了损失报错了,现在在看是什么问题。 2 中心损失是在训练过程中,不仅输出类与类的间距变大,类内的间距变小。你可以看下中心损失的定义,我不知道是不是我之前的理解有问题,构建模型的时候就是应该多少分类就多少个输出节点,不要管embedding的问题。
@busyyang tiplet loss 的label 只用于在线样本采样,和中心损失,insight 不一样的
@busyyang 模型 输出的节点要根据损失是如何设计的,也可以设计多输出,多输出,计算一样的
对的,我之前应该是搞混了,中心损失的输出层节点就是有多少类就输出多少的。