tensorflow与pytorch关于卷积尺寸计算不同之处

pytorch与tensorflow主要是padding的指定不同。

tensorflow主要有两种方式‘same’、与‘valid’。其卷积尺寸计算公式为:
注:这里假设图像尺寸长宽一样
same:说明卷积之后的图像尺寸与输入图像一样,则
输出图像尺寸=输入图像尺寸/卷积核步长(若除不尽,向上取整)
valid:相当于padding=0,表示没有填充
输出图像尺寸=(输入图像尺寸-卷积核尺寸)/卷积核步长 + 1

对于pytorch的padding是指定某个数,其会有一个统一公式:
输出图像尺寸=(输入图像尺寸-卷积核尺寸+2*padding)/卷积核步长 + 1
当padding为0时与tensorflow的valid一样

这里的填充是通过padding指定的,当padding为整数n时,默认在上下左右填充n行n列;当padding为二元数组(m,n)时,默认在height的上下填充m行0值,在width维度上左右填充n列0值。会优先使用上面和左边的填充行列。
在这里插入图片描述
在这里插入图片描述
dilation rate (膨胀率,主要用于空洞卷积,想了解可以看下空洞卷积的知识)指的是kernel的间隔数量,就是卷积核进行卷积时在原始图像上每次移动的间隔,正常情况下dilation默认为1,即每次移动一格,如下所示
tensorflow与pytorch关于卷积尺寸计算不同之处_第1张图片
作者:欠我的都给我吐出来
链接:https://www.jianshu.com/p/70972b8fb6ee
来源:简书

其实,tensorflow与pytorch关于卷积尺寸计算原理一样,只不过换个方式而已,主要两种,要么填充和原来图像一样大小,要么不填充,一个是用字符替代,一个是确切的指定填充的行列个数,当然对于指定的pytorch来说,其填充的范围更广一些,也复杂一些。

另外看到一位老哥说,只对比说明padding为‘same’和‘valid’,stride为1和2,kernel为1和3的情况,对于更大的stride和kernel,可能会不一样,目前没有测试,这时两者的主要差异是

对于输入为偶数分辨率(如输入为 224 * 224 * channals )的情况
对于这种情况,卷积需要进行单边填充,正常是上下左右都填充(假设只填充1行和1列,填充3行和3列是一样的),而pytorch和tensorflow对填充的边是不一样的,pytorch是对左边和上边进行填充,而tensorflow是对右边和下边进行填充。

tensorflow与pytorch关于卷积尺寸计算不同之处_第2张图片 tensorflow与pytorch关于卷积尺寸计算不同之处_第3张图片

原文链接:https://blog.csdn.net/weixin_44554475/article/details/106239967

这里顺便说一下池化层,它和卷积层的区别
池化层有最大池化与均值池化,本质是降低图像的维度,与卷积层类似,不同的是池化层不需要进行相关参数的调节,只有池化核大小与步长,不改变原始图像的通道数,而卷积层可能会改变,因为输出图像的通道数等于卷积核的个数

这里用一个例子讲解卷积层与池化层关于图像尺寸的计算问题
卷积神经网络(CNN)张量(图像)的尺寸和参数计算(深度学习)
这里面池化层默认为padding=0,也即valid模式不进行填充,实际池化层也具有填充选项,如果考虑填充那么公式和卷积层公式一样。

tensorflow中池化运算的函数为,

tensorflow.nn.max_pool(value, ksize, strides, padding)

从函数的参数即可看出来,它和卷积层非常相似,它的参数概念分别是,

value:输入数据或者上一层网络输出的结果
ksize:卷积核,它的是一个1*4维的参数,例如ksize=[1, 3, 3, 1],这4个数字的概念分别是batch维度池化窗口、池化窗口高度、池化窗口宽度、通道维度窗口尺寸,由于在batch和通道维度不进行池化,所以通常情况下第1和第4个元素为1
strides:这和卷积层中相同
padding:这和卷积层中的也相同
卷积层、池化层与填充

其它相关知识链接
分组卷积、深度可分离卷积
空洞卷积
深度神经网络中的感受野
CNN 感受野计算公式

你可能感兴趣的:(深度学习,计算机视觉,tensorflow,pytorch,深度学习)