之前一段时间,对激活函数和损失函数一直是懵懂的状态,只知道最后一层常用的激活函数是sigmoid或者softmax,而损失函数一般用的是cross-entropy或者dice loss(我看的都是分割方向的)。但是有几个点一直弄不清为什么:
1、为什么有时候二值分割问题还进行了one-hot编码?
2、sigmoid和softmax是可以任意切换的吗?
下面是我理解的东西,但不一定正确,仅供参考。
首先要知道,一般说到cross-entropy,都指的是categorical cross-entropy。
binary cross-entropy是需要特意说明为binary的。
那么,categorical cross-entropy的定义是什么呢?
就是对于输出的score,先进行softmax变换,再计算cross-entropy。
重点就在这儿,是进行了softmax变换!原因后面会说到。
而binary cross-entropy的定义则是,对于对于输出的scroe,先进行sigmoid变换,再计算binary cross entropy。
看,这儿又是sigmoid!
原因就在于,cross entropy本身的定义就是在概率分布上,而概率分布则要求两个或两个以上的值加起来等于1。如果去看softmax函数,会发现,这个函数就有这个作用:使每一个样本的输出结果在所有的类上加起来等于1。而sigmoid函数,去看它的形状就可以发现,它只是单纯的将输出结果压缩到了0-1之间。
那么现在,我们想计算binary的cross-entropy怎么办呢?
有两种解决方案。
第一,就是利用现有的专门针对binary的cross-entropy公式
可以发现,其实这儿的1-p(yi)就是做了与softmax类似的事,!!将输出的结果相加可以为1。
所以说,已经可以发现,它们之间那紧密的联系了。
第二,就是将binary转化为categorical的问题。
也就是直接利用cross-entropy的公式
可是上面也提到过,用这个公式的前提就是输出结果在所有的类上加起来为1。
那么,我们使用softmax激活函数就行了,但是别忘记,对于categorical cross entropy的问题,默认的label都是需要one-hot编码的。
2019/7/10更新:更正上面的话:label都是需要one-hot编码,其实严谨的说法是,对于cross-entropy公式而言,其要求是label进行了one-hot编码,但由于我们一般都是使用框架的api计算损失,因此不同的api会对label有着不同的要求,对于tensorflow而言,关于cross-entropy常用的就有下面三种
第一、二种的label都需要自己进行one-hot编码处理,第三种不需要
1: tf.nn.softmax_cross_entropy_with_logits
(其实这种已经depressed,被第二种代替)
2:tf.nn.softmax_cross_entropy_with_logits_v2
(这种相对于第一种而言,反向传播时也会传递label,这在非监督式学习中很有用)
3:tf.nn.sparse_softmax_cross_entropy_with_logits
(可以用tf.argmax()
转换one-hot为普通格式)
注意,上一句说的使用softmax函数,前提也是把数据先转化成了对应的格式,如下:
conv6 = Conv2D(2, (1, 1), activation='relu',padding='same')(conv5)
conv6 = core.Reshape((2,patch_height*patch_width))(conv6)
conv6 = core.Permute((2,1))(conv6)
# conv6最后的shape