网站首页 > 技术教程 正文
在用tensorflow写CNN的时候,调用卷积核api的时候,会有填padding方式的参数,找到源码中的函数定义如下(max pooling也是一样):
def conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None,
data_format=None, name=None)
源码中对于padding参数的说明如下:
padding: A string from: "SAME", "VALID".
The type of padding algorithm to use.
说了padding可以用“SAME”和“VALID”两种方式,但是对于这两种方式具体是什么并没有多加说明。
这里用Stack Overflow中的一份代码来简单说明一下,代码如下:
x = tf.constant([[1., 2., 3.], [4., 5., 6.]]) x = tf.reshape(x, [1, 2, 3, 1]) # give a shape accepted by tf.nn.max_pool valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID') same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME') print(valid_pad.get_shape()) print(same_pad.get_shape()) 1 2 3 4 5 6 7 8 9 10
最后输出的结果为:
(1, 1, 1, 1)
(1, 1, 2, 1)
可以看出“SAME”的填充方式是比“VALID”的填充方式多了一列。
让我们来看看变量x是一个2x3的矩阵,max pooling窗口为2x2,两个维度的strides=2。
第一次由于窗口可以覆盖(橙色区域做max pool操作),没什么问题,如下:
123456
接下来就是“SAME”和“VALID”的区别所在,由于步长为2,当向右滑动两步之后“VALID”发现余下的窗口不到2x2所以就把第三列直接去了,而“SAME”并不会把多出的一列丢弃,但是只有一列了不够2x2怎么办?填充!
12304560
如上图所示,“SAME”会增加第四列以保证可以达到2x2,但为了不影响原来的图像像素信息,一般以0来填充。(这里使用表格的形式展示,markdown不太好控制格式,明白意思就行),这就不难理解不同的padding方式输出的形状会有所不同了。
在CNN用在文本中时,一般卷积层设置卷积核的大小为n×k,其中k为输入向量的维度(即[n,k,input_channel_num,output_channel_num]),这时候我们就需要选择“VALID”填充方式,这时候窗口仅仅是沿着一个维度扫描而不是两个维度。可以理解为统计语言模型当中的N-gram。
我们设计网络结构时需要设置输入输出的shape,源码nn_ops.py中的convolution函数和pool函数给出的计算公式如下:
If padding == "SAME": output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides[i]) If padding == "VALID": output_spatial_shape[i] = ceil((input_spatial_shape[i] - (spatial_filter_shape[i]-1) * dilation_rate[i]) / strides[i]). 1 2 3 4 5 6 7 8
dilation_rate为一个可选的参数,默认为1,这里我们可以先不管它。
整理一下,对于“VALID”,输出的形状计算如下:
new_height=new_width=?(W–F+1)
S
?
new_height=new_width=?(W–F+1)S?
对于“SAME”,输出的形状计算如下:
new_height=new_width=?W
S
?
new_height=new_width=?WS?
其中,W
W为输入的size,F
F为filter为size,S
S为步长,??
??为向上取整符号。
猜你喜欢
- 2024-09-24 SAP执行QS51维护UD的选择集,报错 – Transaction no longer valid
- 2024-09-24 开机显示invalid partition table(无效的磁盘分区)
- 2024-09-24 2021-09-22:请你判断一个 9x9 的数独是否有效。只需要 根据以下规
- 2024-09-24 编码规范-Python:valid-classmethod-first-arg限制
- 2024-09-24 最好用的MODBUS测试软件MODSCAN
- 2024-09-24 Ubuntu系统怎么设置静态ip?同样适用于深度系统的教程
- 2024-09-24 tomcat8拦截不合法字符的解决方法
- 2024-09-24 LeetCode 65. Valid Number
- 2024-09-24 SpringValid优雅校验入参
- 2024-09-24 SpringMVC,SpringBoot快速验证参数是否完整 基于@Valid注解
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)