一些问题

CNN 输入输出步长padding计算

卷积操作

i 是输入大小,p是padding,f是卷积核大小 ,o为输出大小

o = (n+2p-m)/s + 1

理解:n + 2p 是补全后的图大小,-m 是减去了不可能走到的位置(最后卷积核盖住了最后m的大小不能再扫描了,如下图),/s 除以步长,是可以走的步数,最后 +1

一些问题

CNN、全连接计算

参数量计算、计算量计算

https://zhuanlan.zhihu.com/p/77471991

https://zhuanlan.zhihu.com/p/86587652

参数量:

参数量是一层一层算

全连接层

假设 输入神经元数为M,输出神经元数为N,则

(1)bias为True时:

则参数数量为:M*N + N(bias的数量与输出神经元数的数量是一样的)

(2)bias为False时:

则参数数量为:M×N

卷积网络

假设卷积核的大小为 k*k, 输入channel为M, 输出channel为N。

(1)bias为True时:

则参数数量为:k×k×M×N + N(bias的数量与输出channel的数量是一样的)

(2)bias为False时:

则参数数量为:k×k×M×N

(3)当使用BN时,还有两个可学习的参数α和β,参数量均为N

则参数数量为:k×k×M×N + 3×N

计算量(这个计算量网上算法不唯一,仅供参考)

全连接

假设 输入神经元数为M,输出神经元数为N,则

(1)先执行M次乘法;

(2)再执行M-1次加法

(3)加上bias,计算出一个神经元的计算量为 (M+M-1+1)

(4)N个输出神经元,则总的计算量为 2M×N

理解CNN 参数共享、CNN与FCN关系

简单理解,权值共享,就是卷积核(卷积核中就是权值)不变,扫过整个图片

生成的特征图片中每一个像素关联了原图中的一部分像素(一般是卷积核大小的部分)

但是每一像素使用的权值是一样的。

具体解释:https://www.zhihu.com/question/47158818?sort=created

交叉熵的使用

CE:

手算应用:https://blog.csdn.net/guolindonggld/article/details/79250642

用在多分类中, gt为0的一乘全为0,只剩一个与真实值一致的项

BCE:

BCE与CE在数学上没有本质区别,只不过一个用于CE多分类,BCE用于二分类

解释:https://blog.csdn.net/weixin_35990358/article/details/113551793

摘抄:

首先需要说明的是PyTorch里面的BCELoss和CrossEntropyLoss都是交叉熵,数学本质上是没有区别的,区别在于应用中的细节。

BCE适用于0/1二分类,计算公式就是 “ -ylog(y^hat) - (1-y)log(1-y^hat) ”,

其中y为GT,y_hat为预测值。

这样,当gt为0的时候,公式前半部分为0,y^hat 需要尽可能为0才能使后半部分数值更小;当gt为1时,后半部分为0,y^hat 需要尽可能为1才能使前半部分的值更小,这样就达到了让y^hat尽量靠近gt的预期效果。

当然,显然这要求输入必须在0-1之间,所以为了让网络的输出确保在0-1之间,我们一般都会加一个Sigmoid。

而更具体一点来说,使用BCELoss的话只需要网络输出一个节点即可,不像CE Loss那样,往往是有n_class个类就需要网络最终输出n_class个节点。

而CE因为需要用在多分类上,所以计算公式就变成了sum(-ylog(y^hat))。

可能有些同学很敏锐的发现了,这个函数实际上只是在对相应gt=1的那个节点的值做约束,希望这一点的输出能尽量为1;而其他原本gt为0的节点因为y=0,在计算到sum中的时候无论其相应输出节点是多少都没有关系,那这是不是意味着CE的公式还有漏洞呢?

话虽这么说,但其实是因为我们忘记了CE之前还有Softmax这个函数,这个函数会让输入的n_class个节点中大的更大,小的更小,并且可以确保最终所有节点的输出的总和为1,这样一来只要对应gt=1的那个节点输出足够靠近1,其他的节点自然输出就会趋近于0了。

上面的两个例子都是在分类任务中说的,而在分割任务中,BCE和CE的另一个区别就可以说是,BCE只需要输出一个通道,而CE需要输出n_class个通道。

上一篇:Mybatis【1】-- 第一个Mybatis程序


下一篇:UVA536 二叉树重建 Tree Recovery