TensorFlow的Padding操作是如何补0的

转载出处:http://blog.youkuaiyun.com/accumulate_zhang/article/details/78359856


原文链接:http://blog.youkuaiyun.com/accumulate_zhang/article/details/78359856


1.podding='SAME'时,全0填充。


2.padding=“VALID”,不使用全0填充




原本书上的内容,一开始看的时候没注意,没仔细看,只是单纯的理解为padding为SAME就补0;为VALID就不补0;

后来看代码的时候感觉不对劲,后来找了一些资料,才醒悟过来



根据tensorflow中的conv2d函数,我们先定义几个基本符号
1、输入矩阵 W×W,这里只考虑输入宽高相等的情况,如果不相等,推导方法一样,不多解释。
2、filter矩阵 F×F,卷积核
3、stride值 S,步长
4、输出宽高为 new_height、new_width
当然还有其他的一些具体的参数,这里就不再说明了。
我们知道,padding的方式在tensorflow里分两种,一种是VALID,一种是SAME,下面分别介绍这两种方式的实际操作方法。
1、如果padding = ‘VALID’
new_height = new_width = (W – F + 1) / S (结果向上取整)
也就是说,conv2d的VALID方式不会在原有输入的基础上添加新的像素(假定我们的输入是图片数据,因为只有图片才有像素),输出矩阵的大小直接按照公式计算即可。
2、如果padding = ‘SAME’
new_height = new_width = W / S (结果向上取整)
在高度上需要pad的像素数为
pad_needed_height = (new_height – 1)  × S + F - W
根据上式,输入矩阵上方添加的像素数为
pad_top = pad_needed_height / 2  (结果取整)
下方添加的像素数为
pad_down = pad_needed_height - pad_top
以此类推,在宽度上需要pad的像素数和左右分别添加的像素数为
pad_needed_width = (new_width – 1)  × S + F - W
pad_left = pad_needed_width  / 2 (结果取整)
pad_right = pad_needed_width – pad_left


按照上面的计算方法,对于下面这几行,用2*2的filter去池化,全0填充,移动步长是2,对28*28*32的矩阵。用常规的思路,发现又要补0,又要池化,怎么会得到输出是14*14*32的结果呢?



其实这种思路是错的,首先应该去看参数的值是SMAE还是VALID,然后根据上面的公式直接去计算补0 的具体操作以及得到的输出矩阵的大小。

new_height = new_width = W / S (结果向上取整)28/2=14
在高度上需要pad的像素数为
pad_needed_height = (new_height – 1)  × S + F - W(14-1)*2+2-28等于0,发现根本不需要补0的
根据上式,输入矩阵上方添加的像素数为
pad_top = pad_needed_height / 2  (结果取整)
下方添加的像素数为
pad_down = pad_needed_height - pad_top

<think>好的,我现在需要详细回答用户关于反卷积操作的问题。首先,我要明确用户的需求,他们想了解反卷积的具体操作方法、过程以及如何实现。根据用户提供的引用内容,我需要整合这些信息,并结合自己的知识,确保回答准确且符合格式要求。 首先,我应该从反卷积的基本概念开始,解释它是什么,别称以及主要用途。用户提供的引用中提到反卷积又称转置卷积或上采样,主要用于图像分割、生成对抗网络等需要增大尺寸的任务。这一点需要明确。 接下来是数学原理部分。用户提到可以通过离散卷积的反向操作来理解,这里可能需要用公式说明。例如,标准的卷积操作可以用矩阵乘法表示,而反卷积则是其转置。这里需要写出数学表达式,使用$$...$$格式,并确保变量符号正确。 然后是操作步骤的分解。根据引用中的信息,特别是引用[4]提到的零方式和padding计算,我需要详细说明反卷积的具体步骤,如输入扩展、零、卷积核旋转和应用步长。可能需要分点说明每个步骤的关键点,比如零的位置和数量,卷积核的旋转方式,以及步长如何影响输出尺寸。 实现部分,用户提到了TensorFlow中的conv2d_transpose函数,需要引用引用[3]和[4]的内容。这里要列出函数参数,并解释每个参数的作用,比如output_shape的重要性,padding的两种模式(VALID和SAME)对输出的影响。同时,可能还需要给出一个简单的代码示例,但用户要求使用中文回答,代码部分需要用Python示例,但根据用户提供的示例,代码块需要正确使用格式,比如用三个反引号包围,并注明语言。 然后,关于输出尺寸的计算公式,用户提供的引用中有提到VALID和SAME两种模式下的不同公式。需要整理这些公式,并正确使用LaTeX格式。例如,VALID模式下输出尺寸的计算可能涉及输入尺寸、步长、卷积核大小,而SAME模式则需要考虑零的情况。引用[3]中的公式可能需要重新表述,确保正确性。 应用场景部分,需要结合引用中的信息,比如图像分割、GAN、超分辨率等,说明反卷积在这些任务中的作用。 最后,用户要求生成相关问题,我需要根据反卷积的内容提出几个相关的问题,比如数学原理、应用场景、与转置卷积的区别、参数影响等。 在整理过程中,需要注意以下几点: 1. 所有行内数学表达式用$...$,例如输入尺寸$H_{in}$,步长$s$。 2. 独立公式如输出尺寸公式需要用$$...$$并单独成段。 3. 正确引用用户提供的参考文献,在相关位置添加引用标识,如[^1]、[^2]等。 4. 结构清晰,分步骤解释反卷积过程,结合理论和实现。 5. 确保LaTeX语法正确,例如积分符号、上下标等。 现在检查是否有遗漏的部分,比如反卷积与普通卷积的区别,或者具体例子说明零的方式。根据引用[4],零的总宽度是k_size-1,左右可能不对称,需要详细说明。例如,当k_size=3时,零左右各1,而k_size=4时,左边1,右边2。这部分需要准确描述。 另外,在实现代码部分,需要给出TensorFlow的示例代码,展示如何使用conv2d_transpose函数,设置参数如filter、output_shape、strides等,并解释参数的意义。例如,输入形状、卷积核大小、步长如何影响输出形状。 最后,确保回答符合用户要求的格式,没有使用Markdown,使用中文,分点清晰,参考文献正确引用,并在末尾生成相关问题。</think>### 反卷积操作详解 #### 1. 基本概念 **反卷积**(Deconvolution),又称**转置卷积**(Transposed Convolution)或**上采样卷积**(Upsampled Convolution)[^2],是一种通过卷积操作实现输出尺寸增大的技术。它常用于图像分割、生成对抗网络(GAN)等需要恢复高分辨率数据的场景。 #### 2. 数学原理 反卷积可视为标准卷积的逆向操作。假设标准卷积的矩阵形式为$Y = WX$($W$为卷积核矩阵,$X$为输入),则反卷积的矩阵形式为$Y' = W^T X'$,即对卷积核矩阵$W$进行转置后与输入相乘。 **输入输出关系**(以尺寸为例): - **标准卷积**:输入尺寸$H_{in}$,输出尺寸$H_{out} = \frac{H_{in} - k + 2p}{s} + 1$($k$为卷积核大小,$p$为零数,$s$为步长)。 - **反卷积**:输入尺寸$H_{in}$,输出尺寸$H_{out} = s \cdot (H_{in} - 1) + k - 2p$[^3]。 #### 3. 操作步骤 反卷积通过以下步骤实现**尺寸扩展**: 1. **输入扩展**:在输入特征图的元素之间插入$(s-1)$个零($s$为步长),例如输入为$2 \times 2$,步长$s=2$时,扩展为$3 \times 3$。 2. **零(Padding)**:在扩展后的输入周围零,零总量为$k - 1$,但左右/上下可能不对称。例如$k=3$时左右各1,$k=4$时左1、右2[^4]。 3. **卷积核旋转**:将卷积核旋转180度(与标准卷积核的转置对应)。 4. **标准卷积操作**:对扩展并零后的输入进行步长为1的卷积。 #### 4. 实现方法(以TensorFlow为例) ```python import tensorflow as tf # 输入:1张4x4的灰度图,通道数1 input = tf.ones(shape=[1, 4, 4, 1]) # 定义反卷积参数 filters = 1 # 输出通道数 kernel_size = 3 # 卷积核尺寸 strides = 2 # 步长 output_shape = [1, 8, 8, 1] # 目标输出形状 # 反卷积操作 output = tf.nn.conv2d_transpose( input, filters=tf.ones(shape=[kernel_size, kernel_size, filters, input.shape[-1]]), output_shape=output_shape, strides=[1, strides, strides, 1], padding='SAME' ) print(output.shape) # 输出形状为(1, 8, 8, 1) ``` #### 5. 输出尺寸计算 - **VALID模式**: $$ H_{out} = s \cdot (H_{in} - 1) + k $$ 例如输入$H_{in}=5$,$k=3$,$s=2$时,输出$H_{out}=2 \times 4 + 3 = 11$。 - **SAME模式**: $$ H_{out} = s \cdot H_{in} $$ 例如输入$H_{in}=4$,$s=2$时,输出$H_{out}=8$。 #### 6. 应用场景 - **图像分割**:恢复高分辨率特征图以匹配原始图像尺寸。 - **生成对抗网络(GAN)**:从低维噪声生成高分辨率图像。 - **超分辨率重建**:将低分辨率图像放大并增强细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值