strides = 2 的 tf.nn.conv2d 和 2x2 pooling 的 tf.nn.max_pool 有什么区别?
what's the difference between tf.nn.conv2d with strides = 2 and tf.nn.max_pool with 2x2 pooling?
如上所述,
tf.nn.conv2d with strides = 2
和
tf.nn.max_pool with 2x2 pooling
可以将输入的大小减少一半,我知道输出可能会有所不同,但我不知道是否会影响最终的训练结果,请提供任何线索,谢谢。
最终训练的结果实际上可能会有所不同,因为卷积会将张量乘以一个滤波器,您可能不想这样做,因为它会占用额外的计算时间,而且还可能会过度拟合您的模型,因为它会有更多权重。
在您的两个示例中,都假设我们有一个 [height, width]
内核应用了步幅 [2,2]
。这意味着我们将内核应用于二维输入上大小为 [height, width]
的二维 window 以获得输出值,然后将 window 向上或向上滑动 2 down 得到下一个输出值。
假设padding='SAME'
,在这两种情况下,您最终得到的输出比输入少 4 倍(每个维度少 2 倍)
不同之处在于每个 window 的输出值的计算方式:
conv2d
- 输出是输入值乘以
[height, width]
内核中每个单元格的权重的线性组合
- 这些权重成为模型中的可训练参数
max_pool
- 输出只是在
[height, width]
window 个输入值 中选择最大输入值
- 这个操作没有引入权重和可训练的参数
如上所述,
tf.nn.conv2d with strides = 2
和
tf.nn.max_pool with 2x2 pooling
可以将输入的大小减少一半,我知道输出可能会有所不同,但我不知道是否会影响最终的训练结果,请提供任何线索,谢谢。
最终训练的结果实际上可能会有所不同,因为卷积会将张量乘以一个滤波器,您可能不想这样做,因为它会占用额外的计算时间,而且还可能会过度拟合您的模型,因为它会有更多权重。
在您的两个示例中,都假设我们有一个 [height, width]
内核应用了步幅 [2,2]
。这意味着我们将内核应用于二维输入上大小为 [height, width]
的二维 window 以获得输出值,然后将 window 向上或向上滑动 2 down 得到下一个输出值。
假设padding='SAME'
不同之处在于每个 window 的输出值的计算方式:
conv2d
- 输出是输入值乘以
[height, width]
内核中每个单元格的权重的线性组合 - 这些权重成为模型中的可训练参数
max_pool
- 输出只是在
[height, width]
window 个输入值 中选择最大输入值
- 这个操作没有引入权重和可训练的参数