Tensorflow中CNN采用padding='same'时补零位置、卷积核位置

本文通过实验探讨了在TensorFlow中,当使用padding='same'时,补零的具体位置及卷积核如何与数据点对应。通过分析不同长度的数据和卷积核,得出在数据两端补零,卷积核中心点对应数据点的结论。

首先关于padding='same'的理解请参考TensorFlow中CNN的两种padding方式“SAME”和“VALID”

那么问题是,在采用padding='same'补零时,补零位置怎样分配?卷积核kernel的位置又在哪呢(与数据点如何对应)?

太长不看传送门:结论

(tensorflow version1.11.0)


数据长度为4,卷积核长度为3,步长为1,采用padding='same'补零时:

第一种可能——在数据末尾(或前端)补零,卷积核首位对应数据点

第二种可能——在数据两端补零,卷积核中心点对应数据点

import tensorflow as tf

inputs = tf.constant([1, 2, 3, 4], tf.float32)
inputs = tf.reshape(inputs, [1, 4, 1])

cnn = tf.layers.conv1d(
    inputs=inputs,
    filters=1,
    kernel_size=3,
    strides=1,
    padding='same',
    kernel_initializer='ones'
)
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    output = sess.run(cnn)
    print(output.reshape(-1))

设计一个实验,数据为[1, 2, 3, 4], 指定卷积核为[1, 1, 1]

结果是:

3 = 1*0+1*1+1*2,6=1*1+1*2+1*3,9=1*2+1*3+1*4,7=1*3+1*4+1*0

说明是在数据两端补零,卷积核中心点对应数据点。


数据长度为4,卷积核长度为2,步长为1,采用padding='same'补零时:

第一种可能:在数据末尾补零,卷积核首位对应数据点

第二种可能:在数据前端补零,卷积核末位对应数据点

import tensorflow as tf

inputs = tf.constant([1, 2, 3, 4], tf.float32)
inputs = tf.reshape(inputs, [1, 4, 1])

cnn = tf.layers.conv1d(
    inputs=inputs,
    filters=1,
    kernel_size=2,
    strides=1,
    padding='same',
    kernel_initializer='ones'
)
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    output = sess.run(cnn)
    print(output.reshape(-1))

设计一个实验,数据为[1, 2, 3, 4], 指定卷积核为[1, 1]

结果是:

3=1*1+1*2,5=1*2+1*3,7=1*3+1*4,4=1*4+1*0

说明是在数据末尾补零,卷积核首位对应数据点。


!!!但是在实际中,情况更为复杂,请参考下面的结论:


结论

Tensorflow使用这种方式,可以最大程度地使卷积核中心点对应数据点。

<think>嗯,用户想了解TensorFlow中的tf.nn.conv2d函数,特别是参数strides和padding中的'SAME'模式。好的,我得先回忆一下这个函数的基本用法和参数含义。首先,conv2d是用于二维卷积操作的,对吧?参数包括input、filter、strides、padding等等。用户可能在使用卷积神经网络遇到了问题,或者想深入理解这些参数如何影响输出的形状和计算过程。 首先,我需要明确各个参数的作用。输入input通常是一个四维张量,格式可能是NHWC(批次,高度,宽度,通道数)或者NCHW,但默认是NHWC。filter参数是卷积核,形状应该是[高度, 宽度, 输入通道数, 输出通道数]。strides参数控制卷积核在各个维度上的步长,尤其是中间两个维度(高度和宽度)的步长影响输出尺寸。padding有两种模式,'SAME'和'VALID',这决定了输出的尺寸如何计算。 用户特别提到了strides和padding的'SAME'模式。我需要详细解释这两个参数。对于strides,可能用户不太清楚四维步长数组中每个数字的意义,尤其是通常只调整中间两个步长。比如strides=[1, 2, 2, 1],这候在批次和通道上的步长都是1,只在高度和宽度上步长为2,这样输出尺寸会减半。需要举例说明不同步长对输出的影响。 然后是padding='SAME'的情况。这TensorFlow会自动在输入周围零,使得输出的尺寸等于输入尺寸除以步长后向上取整。例如,当步长为1,输出尺寸和输入尺寸相同。而当步长为2,输出尺寸为输入尺寸的一半,如果输入尺寸是奇数,可能需要零。这里可能需要数学公式来展示如何计算输出尺寸,比如对于SAME模式,输出高度是ceil(input_height / stride_h),而VALID模式则是ceil((input_height - filter_height + 1) / stride_h)。需要确保公式用$$...$$格式,行内变量用$符号。 可能用户在使用过程中遇到了输出尺寸不符合预期的情况,或者想了解如何选择合适的padding模式。比如,在构建卷积网络,保持特征图尺寸不变可能需要使用'SAME' padding,而想减少尺寸可能用更大的步长或者'VALID' padding。 另外,用户提供的引用中有提到conv2d的参数示例,比如strides=[1,1,1,1],输出尺寸如何变化。需要结合这些例子具体说明。比如,当输入是48x48,卷积核5x5,padding='SAME',strides=1,输出高度和宽度是多少?根据公式,应该是48,因为(48 + 2*2 -5)/1 +1 =48?或者可能需要更仔细地推导。 还有,用户可能混淆了步长对各个维度的影响,尤其是第一个和最后一个维度通常为1,避免跳过批次或通道。需要强调这一点,防止用户错误设导致问题。 最后,用户可能需要示例代码来直观展示不同参数的效果。比如,引用中的例子展示了不同strides下conv1、conv2、conv3的输出形状。可以结合这些例子解释输出形状的计算过程,比如当strides为[1,2,2,1],输出高度和宽度是输入的一半(假设输入尺寸为偶数)。 总结一下,我需要分点详细解释各个参数,特别是strides和padding,给出数学公式,结合示例代码说明输出形状的计算,并可能指出常见误区。同,根据用户提供的引用,确保引用正确,比如引用[1]中的参数说明,引用[3]中的代码示例,这样用户可以参考站内资料进一步学习。</think>### TensorFlow tf.nn.conv2d 函数详解 `tf.nn.conv2d` 是 TensorFlow 中实现二维卷积操作的核心函数,广泛应用于卷积神经网络(CNN)。其参数含义及工作原理如下: --- #### **1. 核心参数说明** ```python tf.nn.conv2d( input, filter, strides, padding, use_cudnn_on_gpu=True, data_format='NHWC', dilations=[1, 1, 1, 1], name=None ) ``` 1. **`input`** - 输入张量,形状为 `[batch, height, width, in_channels]`(默认格式 `data_format='NHWC'`)。 - 例如:输入图像为 `[64, 48, 48, 3]`,表示批量大小 64,图像尺寸 48×48,3 个颜色通道[^3]。 2. **`filter`** - 卷积核张量,形状为 `[height, width, in_channels, out_channels]`。 - 例如:`[5, 5, 3, 64]` 表示 5×5 的卷积核,输入通道数 3,输出通道数 64。 3. **`strides`** - 步长列表,格式为 `[batch_stride, height_stride, width_stride, channel_stride]`。 - 通常仅调整高度和宽度方向的步长(如 `strides=[1, 2, 2, 1]`),跳过批次和通道维度[^1]。 4. **`padding`** - 填充模式:`'SAME'` 或 `'VALID'`。 - `'SAME'`:自动填充输入,使输出尺寸与输入尺寸按步长缩小后一致(向上取整)。 - `'VALID'`:不填充,输出尺寸小于输入尺寸。 --- #### **2. 输出尺寸计算** - **公式**: $$ \text{输出高度} = \left\lceil \frac{\text{输入高度}}{\text{高度步长}} \right\rceil \quad (\text{SAME 模式}) $$ $$ \text{输出高度} = \left\lceil \frac{\text{输入高度} - \text{卷积核高度} + 1}{\text{高度步长}} \right\rceil \quad (\text{VALID 模式}) $$ (宽度计算同理) - **示例**: - 输入尺寸 48×48,卷积核 5×5,步长 `[1, 1, 1, 1]`,`padding='SAME'`: $$ \text{输出尺寸} = \left\lceil \frac{48}{1} \right\rceil = 48 \times 48 $$ - 步长 `[1, 2, 2, 1]` : $$ \text{输出尺寸} = \left\lceil \frac{48}{2} \right\rceil = 24 \times 24 $$ 实际输出如 `Tensor("Conv2D:0", shape=(64, 48, 48, 64), dtype=float32)`。 --- #### **3. `padding='SAME'` 的填充逻辑** - 若输入尺寸无法被步长整除,`SAME` 模式会在输入**底部和右侧零**。 - 填充量计算: $$ \text{总填充量} = (\text{输出尺寸} \times \text{步长} - \text{输入尺寸} + \text{卷积核尺寸}) $$ - 例如:输入高度 7,步长 2,卷积核高度 3: $$ \text{输出高度} = \left\lceil \frac{7}{2} \right\rceil = 4 $$ $$ \text{总填充量} = (4 \times 2 - 7 + 3) = 4 \quad \text{(上下各 2 行)} $$ --- #### **4. 应用场景** - **`SAME` 模式**:需保持输出尺寸与输入相近(如图像分类任务的特征提取)。 - **`VALID` 模式**:需逐步缩小特征图尺寸(如减少计算量)。 --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值