Tensorflow中padding 参数VALID和SAME的不同
比较不同品牌同类产品的价格和性能参数 #生活知识# #购物技巧# #家电购物须知#
之前看人家程序的时候,看到好多程序卷积层网络中参数padding都是设置SAME,自己一直也没有注意。但是有时候遇到不同的卷积核以及相同的stride,发现最后产生的特征图是一样的,也没有仔细深究。今天刚好也遇到了,上网发现有很多相关资料,这里也就是自己学习一下,下次遇到了就会知其所以然了。
1. 简单公式
这里参考了Tensorflow中卷积的padding操作 首先是引出padding中VALID和SAME具体的公式:
输入矩阵 W×W,这里只考虑输入宽高相等的情况,如果不相等,推导方法一样,不多解释。
filter矩阵 F×F,卷积核
stride值 S,步长
输出宽高为 new_height、new_width
1.1 如果padding = ‘VALID’new_height = new_width = (W – F + 1) / S (结果向上取整)
也就是说,conv2d的VALID方式不会在原有输入的基础上添加新的像素,从公式我们看出: 我们最后得到特征图和输入尺寸,步长也和卷积核的大小都是有关系的。
1.2 如果padding = ‘SAME’new_height = new_width = W / S (结果向上取整),从结果我们可以看出:我们最后得到的特征图和输入尺寸和步长有关系,但是和卷积核大小无关,填充是用0填充的。 这个具体理论解释网上有很多,大家可以参考Tensorflow中padding的两种类型SAME和VALID, tensorflow conv2d的padding解释以及参数解释
2. 例子
2.1 使用padding = ‘VALID’import tensorflow as tf import tensorlayer as tl from tensorlayer.layers import * b_init = tf.constant_initializer(value=0.0) w_init = tf.truncated_normal_initializer(stddev=0.02) image = tf.ones(shape=(1, 256, 256, 3), dtype=tf.float32) * 0.2 net_in = InputLayer(image, name='in') # input size: (1, 256, 256, 3) net_1 = Conv2d(net_in, 64, (7, 7), (1, 1), act=None, padding='VALID', W_init=w_init, name='net_1') net_2 = Conv2d(net_in, 64, (3, 3), (1, 1), act=None, padding='VALID', W_init=w_init, name='net_1') net_1.print_layers() net_2.print_layers()
1234567891011121314151617181920输出:
2018-06-27 19:26:39.479979: I tensorflow/core/platform/s3/aws_logging.cc:53] Initializing Curl library [TL] InputLayer in: (1, 256, 256, 3) [TL] Conv2d net_1: n_filter:64 filter_size:(7, 7) strides:(1, 1) pad:VALID act:identity [TL] Conv2d net_1: n_filter:64 filter_size:(3, 3) strides:(1, 1) pad:VALID act:identity [TL] layer 0: net_1/Identity:0 (1, 250, 250, 64) float32 [TL] layer 0: net_1_1/Identity:0 (1, 254, 254, 64) float32 1234567
分析:
net_1输出特征图: (256-7+1)/1 = 250
net_2输出特征图: (256-3+1)/1 = 254
验证上面的公式是正确的。
2.2 使用padding = ‘SAME’import tensorflow as tf import tensorlayer as tl from tensorlayer.layers import * b_init = tf.constant_initializer(value=0.0) w_init = tf.truncated_normal_initializer(stddev=0.02) image = tf.ones(shape=(1, 256, 256, 3), dtype=tf.float32) * 0.2 net_in = InputLayer(image, name='in') # input size: (1, 256, 256, 3) net_1 = Conv2d(net_in, 64, (7, 7), (1, 1), act=None, padding='SAME', W_init=w_init, name='net_1') net_2 = Conv2d(net_in, 64, (3, 3), (2, 2), act=None, padding='SAME', W_init=w_init, name='net_1') net_1.print_layers() net_2.print_layers()
1234567891011121314151617181920输出:
2018-06-27 19:54:13.179758: I tensorflow/core/platform/s3/aws_logging.cc:53] Initializing Curl library [TL] InputLayer in: (1, 256, 256, 3) [TL] Conv2d net_1: n_filter:64 filter_size:(7, 7) strides:(1, 1) pad:SAME act:identity [TL] Conv2d net_1: n_filter:64 filter_size:(3, 3) strides:(2, 2) pad:SAME act:identity [TL] layer 0: net_1/Identity:0 (1, 256, 256, 64) float32 [TL] layer 0: net_1_1/Identity:0 (1, 128, 128, 64) float32123456
分析:
net_1输出特征图: 256/1 = 256
net_2输出特征图:256/2 = 128
验证上面的公式是正确的。
网址:Tensorflow中padding 参数VALID和SAME的不同 https://www.yuejiaxmz.com/news/view/425078
相关内容
keras遇到的问题详解神经网络各层的结构与功能
DATA
手写数字识别之多GPU训练
卷积神经网络
tensorflow学习之常用函数:tf.reduce
对循环神经网络(RNN)中time step的理解
batch normalization tensorflow实现的正确姿势
决策支持系统的未来:从传统规则引擎到人工智能驱动
决策支持系统的未来:从传统规则引擎到人工智能驱动1.背景介绍 决策支持系统(Decision Support Syste