在keras中,centerloss实战lambda

推荐文章:在Keras使用center-losss损失函数\Keras自定义损失函数
参考地址:https://blog.csdn.net/DumpDoctorWang/article/details/84204476

代码可以直接拿来用,由于实验室服务器tensorflow版本比较旧,报错:TypeError: softmax() got an unexpected keyword argument ‘axis’。
解决方法有多个,都可以尝试下。
方法一:出现了所以需要改tensorflow_backend的源码,tf.nn.softmax()里面的参数。
参考网址:https://www.jianshu.com/p/a1b30ec40b1d?utm_source=oschina-app 写的很详细,可以借鉴
方法二:也有提议给keras降级,尝试过问题更多,很多函数也不能调用。。-_-||,可能是我的系统问题多吧。。
参考网址:https://blog.csdn.net/qq_27871973/article/details/80958537
方法三:就是把第一个网址提供的源码,softmax函数中的axis去掉,能通过,但是具体有什么影响未尝试,建议尝试。
方法四:根本措施,就是升级tf以及keras,包治百病

切入正题,上述问题中,主要调节的就是lambda的系数,建议从0.1开始,以我多次训练结果的(100~200分类的结果来看),不同系数导致的结果是最大的能上去的训练正确率是成正态分布的。(下面的百分数,均代表val_acc。)

比如100类的分类结果是最优结果是0.2,第一次0.2卡在了90%,可以到95%以上的验证准确率,0.1是卡在75%知道训练结束,0.3是65%,0.25是67%,0.15是%77,0.23很低,可能是服务器卡了吧。。。0.18是68%。。所以最终选择了0.2,改成40epoch能到95%,多次训练结果基本都在95~98%。训练中每次损失函数值在4.6附近会震荡多个epoch,然后就像打通任督二脉一样就开始慢慢收敛。比较懵逼。。。

200类则是0.1,(0.2是72%就一直上不去了),可能跟类别总数存在某种关系,还需要进一步实验。

训练提取的特征,比较稀疏(与用此损失函数作比较),截取一部分显示。
在keras中,centerloss实战lambda_第1张图片
大概的实验结论:在结合使用这两种损失函数时,可以认为softmax交叉熵负责增加inter-class(类间)距离,center-loss负责减小intra-class(类内)距离,这样学习到的特征判别度会更高。(不过需要进一步实验)

注意一点,调用训练后的模型会报错,主要是:自定义评估函数和损失函数loss训练模型后加载模型出现ValueError: Unknown metric function:loss
解决方法是:load_model(file_path,custom_objects={‘loss’: cl.loss, ‘accuracy’:cl.categorical_accuracy})
参考网址:https://blog.csdn.net/aojue1109/article/details/88058965

欢迎私信以及留言,有问题可以积极讨论。。。

你可能感兴趣的:(深度学习)