### 卷积神经网络中的Valid与Same Padding
#### Valid Padding
在有效填充(`VALID`)的情况下,输入特征图不会添加任何填充。这意味着滤波器仅应用于图像的有效部分,即完全覆盖的部分。因此,输出特征图通常会比输入特征图小。这种设置适用于希望减少空间维度的情况。
对于给定的输入尺寸 \( W \times W \),滤波器大小 \( F \times F \),步长 \( S \),以及无填充时:
\[ N = \left\lfloor{\frac{W - F}{S} + 1}\right\rfloor \]
其中 \( N \) 是输出的高度或宽度[^4]。
例如,在 `strides=2*2` 的情况下应用 `VALID` 填充,如果输入形状为 `[N, 3, 3, C]` 并且使用了一个 \( 2\times2 \) 大小的过滤器,则计算得到的输出将是 `[N, 1, 1, C']` 形状,这里 \( C' \) 表示通道数量可能因卷积操作而变化[^2]。
```python
import tensorflow as tf
input_tensor_valid = tf.constant(
[[[[1], [2]], [[3], [4]]]],
dtype=tf.float32)
output_valid = tf.nn.conv2d(input=input_tensor_valid,
filters=tf.ones([2, 2, 1, 1]),
strides=[1, 2, 2, 1],
padding='VALID')
print(output_valid.shape)
```
#### Same Padding
相比之下,相同填充(`SAME`)会在必要时向输入边缘添加额外的零值像素,从而确保经过卷积层处理后的输出具有与原始输入相同的尺寸。这对于保持空间分辨率特别有用。
同样地,考虑上述参数配置下的情况,但在 `SAME` 模式下执行卷积操作将会使输出保留接近于原输入的尺寸。
```python
input_tensor_same = tf.constant(
[[[[1], [2], [3]],
[[4], [5], [6]],
[[7], [8], [9]]]],
dtype=tf.float32)
output_same = tf.nn.conv2d(input=input_tensor_same,
filters=tf.ones([2, 2, 1, 1]),
strides=[1, 2, 2, 1],
padding='SAME')
print(output_same.shape)
```