keras 多任务多loss实例

记录一下:

# Three loss functions
category_predict1 = Dense(100, activation='softmax', name='ctg_out_1')(
  Dropout(0.5)(feature1)
)
category_predict2 = Dense(100, activation='softmax', name='ctg_out_2')(
  Dropout(0.5)(feature2)
)
dis = Lambda(eucl_dist, name='square')([feature1, feature2])
judge = Dense(2, activation='softmax', name='bin_out')(dis)
model = Model(inputs=[img1, img2], outputs=[category_predict1, category_predict2, judge])
model.compile(optimizer=SGD(lr=0.0001, momentum=0.9),
       loss={
         'ctg_out_1': 'categorical_crossentropy',
         'ctg_out_2': 'categorical_crossentropy',
         'bin_out': 'categorical_crossentropy'},
       loss_weights={
         'ctg_out_1': 1.,
         'ctg_out_2': 1.,
         'bin_out': 0.5
       },
       metrics=['accuracy'])

补充知识:多分类loss函数本质理解

一、面对一个多分类问题,如何设计合理的损失函数呢?

1、损失函数的本质在数学上称为目标函数;这个目标函数的目标值符合最完美的需求;损失函数的目标值肯定是0,完美分类的损失必然为0 ;

2、损失函数分为两部分,一部分为正确的分类,一部分为错误的分类;保留其中任何一个部分都可以达到目标;就好比两条路都可以通向罗马;都可以通过转化均可以令损失函数的最小值为0时,为目标值;(当然最小值不一定要为0 );最关键是最小化方向是通向目标值的;

3、多分类问题涉及概率问题,目标函数中设计只保留正确的部分(为什么不保留错误部分,我想都可以达到目的,这里保留正确部分,计算更方便);用极值思维想象完美分类情况下,输出的正确类别的概率必然是1,所以损失函数loss=-1/n(Px1+Px2+Px3+……);Px1代表样本x为x1的情况下,输出样本类别相同的概率;最好的情况就是p值都为1;损失值为0 ,可loss函数为-1;如何设计才能等效呢?答案就是加log函数;Loss=-1/n(logPx1+logPx2+logPx3+……);目标函数最小值就是0;

二、 如何在损失函数中只保留正确的部分呢?

1、从逆向的角度而言,错误部分的前面加个系数0,正确部分为1;从简单开始做起,比如说01分类,y*(logPy=1)+(1-y)*(logPy=0); y为样本真实分类;这个就能保存了;y=1时,就保留了第一部分,y=0时就保留了第二部分;但当将01分类扩展成三分类甚至多分类时,这种情况就不能够适应了;这是因为没有明白本质问题;

2、可以将真实样本标签输出转化成概率值;只是正确的概率值为1,其他类别概率为0;这样就可以完美解决多分类的问题;就是说每一个模型输出类别Log概率前乘以一个概率值; 这个公式里面的P值全为1;为0的忽略掉了;

三、如何优化呢?

1、模型输出的概率值转化为一个h(x)的函数;通过改变函数内部的w值来达到最小值;也许达不到0值;这个跟函数的Power(拟合能力)有关;

四、cross-entropy loss公式怎么写呢?

Y代表样本的one-hot向量;yhat代表softmax输出的向量

以上这篇keras 多任务多loss实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • keras 自定义loss损失函数,sample在loss上的加权和metric详解

    首先辨析一下概念: 1. loss是整体网络进行优化的目标, 是需要参与到优化运算,更新权值W的过程的 2. metric只是作为评价网络表现的一种"指标", 比如accuracy,是为了直观地了解算法的效果,充当view的作用,并不参与到优化过程 在keras中实现自定义loss, 可以有两种方式,一种自定义 loss function, 例如: # 方式一 def vae_loss(x, x_decoded_mean): xent_loss = objectives.binary_

  • Keras之自定义损失(loss)函数用法说明

    在Keras中可以自定义损失函数,在自定义损失函数的过程中需要注意的一点是,损失函数的参数形式,这一点在Keras中是固定的,须如下形式: def my_loss(y_true, y_pred): # y_true: True labels. TensorFlow/Theano tensor # y_pred: Predictions. TensorFlow/Theano tensor of the same shape as y_true . . . return scalar #返回一个标量

  • 基于Keras 循环训练模型跑数据时内存泄漏的解决方式

    在使用完模型之后,添加这两行代码即可清空之前model占用的内存: import tensorflow as tf from keras import backend as K K.clear_session() tf.reset_default_graph() 补充知识:keras 多个模型测试阶段速度越来越慢问题的解决方法 问题描述 在实际应用或比赛中,经常会用到交叉验证(10倍或5倍)来提高泛化能力,这样在预测时需要加载多个模型.常用的方法为 mods = [] from keras.ut

  • 在keras中实现查看其训练loss值

    想要查看每次训练模型后的 loss 值变化需要如下操作 loss_value= [ ] self.history = model.fit(state,target_f,epochs=1, batch_size =32) b = abs(float(self.history.history['loss'][0])) loss_value.append(b) print(loss_value) loss_value = np.array( loss_value) x = np.array(range

  • keras中的loss、optimizer、metrics用法

    用keras搭好模型架构之后的下一步,就是执行编译操作.在编译时,经常需要指定三个参数 loss optimizer metrics 这三个参数有两类选择: 使用字符串 使用标识符,如keras.losses,keras.optimizers,metrics包下面的函数 例如: sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True) model.compile(loss='categorical_crossentropy', opt

  • keras 多任务多loss实例

    记录一下: # Three loss functions category_predict1 = Dense(100, activation='softmax', name='ctg_out_1')( Dropout(0.5)(feature1) ) category_predict2 = Dense(100, activation='softmax', name='ctg_out_2')( Dropout(0.5)(feature2) ) dis = Lambda(eucl_dist, nam

  • 关于keras多任务多loss回传的思考

    如果有一个多任务多loss的网络,那么在训练时,loss是如何工作的呢? 比如下面: model = Model(inputs = input, outputs = [y1, y2]) l1 = 0.5 l2 = 0.3 model.compile(loss = [loss1, loss2], loss_weights=[l1, l2], ...) 其实我们最终得到的loss为 final_loss = l1 * loss1 + l2 * loss2 我们最终的优化效果是最小化final_los

  • Keras搭建Mask R-CNN实例分割平台实现源码

    目录 什么是Mask R-CNN Mask R-CNN实现思路 一.预测部分 1.主干网络介绍 2.特征金字塔FPN的构建 3.获得Proposal建议框 4.Proposal建议框的解码 5.对Proposal建议框加以利用(Roi Align) 6.预测框的解码 7.mask语义分割信息的获取 二.训练部分 1.建议框网络的训练 2.Classiffier模型的训练 3.mask模型的训练 训练自己的Mask-RCNN模型 1.数据集准备 2.参数修改 3.模型训练 什么是Mask R-CN

  • keras 特征图可视化实例(中间层)

    鉴于最近一段时间一直在折腾的CNN网络效果不太理想,主要目标是为了检测出图像中的一些关键点,可以参考人脸的关键点检测算法. 但是由于从数据集的制作是自己完成的,所以数据集质量可能有待商榷,训练效果不好的原因可能也是因为数据集没有制作好(标点实在是太累了). 于是想看看自己做的数据集在进入到网络后那些中间的隐藏层到底发生了哪些变化. 今天主要是用已经训练好的mnist模型来提前测试一下,这里的mnist模型的准确度已经达到了98%左右. 使用的比较简单的一个模型: def simple_cnn()

  • 对Keras自带Loss Function的深入研究

    本文研究Keras自带的几个常用的Loss Function. 1. categorical_crossentropy VS. sparse_categorical_crossentropy 注意到二者的主要差别在于输入是否为integer tensor.在文档中,我们还可以找到关于二者如何选择的描述: 解释一下这里的Integer target 与 Categorical target,实际上Integer target经过独热编码就变成了Categorical target,举例说明: (类

  • keras 自定义loss层+接受输入实例

    loss函数如何接受输入值 keras封装的比较厉害,官网给的例子写的云里雾里, 在stackoverflow找到了答案 You can wrap the loss function as a inner function and pass your input tensor to it (as commonly done when passing additional arguments to the loss function). def custom_loss_wrapper(input_

  • keras自定义回调函数查看训练的loss和accuracy方式

    前言: keras是一个十分便捷的开发框架,为了更好的追踪网络训练过程中的损失函数loss和准确率accuracy,我们有几种处理方式,第一种是直接通过 history=model.fit(),来返回一个history对象,通过这个对象可以访问到训练过程训练集的loss和accuracy以及验证集的loss和accuracy. 第二种方式就是通过自定义一个回调函数Call backs,来实现这一功能,本文主要讲解第二种方式. 一.如何构建回调函数Callbacks 本文所针对的例子是卷积神经网络

  • keras处理欠拟合和过拟合的实例讲解

    baseline import tensorflow.keras.layers as layers baseline_model = keras.Sequential( [ layers.Dense(16, activation='relu', input_shape=(NUM_WORDS,)), layers.Dense(16, activation='relu'), layers.Dense(1, activation='sigmoid') ] ) baseline_model.compil

随机推荐