深度学习中的SAME和VALID填充方式
摘要
本文将介绍深度学习中的'SAME'和'VALID'填充方式,并通过例子进行说明。我们将使用TensorFlow和Python来实现这些填充方式。
内容
深度学习中的卷积操作通常需要对输入数据进行填充,以确保输出大小符合预期。TensorFlow中的卷积操作提供了两种常用的填充方式:'SAME'和'VALID'。
'VALID'填充方式
- 'VALID'填充方式表示不进行填充操作。
- 在卷积操作中,'VALID'填充方式的输出大小会根据输入数据大小、卷积核大小以及步长进行计算。
- 'VALID'填充方式的输出大小计算公式为:
1out_height = ceil(float(in_height - filter_height + 1) / float(strides[1])) 2out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))
其中,in_height
和in_width
为输入数据的高度和宽度,filter_height
和filter_width
为卷积核的高度和宽度,strides[1]
和strides[2]
为步长的垂直和水平方向上的大小。
'SAME'填充方式
- 'SAME'填充方式表示进行填充操作,以确保输出大小与输入大小相同。
- 在卷积操作中,'SAME'填充方式会在输入数据的上下左右分别填充一定数量的0。
- 'SAME'填充方式的输出大小计算公式为:
1out_height = ceil(float(in_height) / float(strides[1])) 2out_width = ceil(float(in_width) / float(strides[2]))
同时,还需要根据计算结果对输入数据进行填充,以确保输出大小与输入大小相同。
为了更好地理解'SAME'和'VALID'填充方式,我们将通过一个例子来进行说明。
假设输入数据为一个形状为[2, 3],通道数为1的图像,并设置填充方式为'SAME'和'VALID',核大小为2x2,步长为2。
对于'SAME'填充方式,我们将输入数据进行填充,填充后的大小为[2, 4]。然后,我们对填充后的数据进行最大池化操作,得到输出的大小为[1, 2]。具体代码如下所示:
1import tensorflow as tf
2
3x = tf.constant([[1., 2., 3.],
4 [4., 5., 6.]])
5x = tf.reshape(x, [1, 2, 3, 1])
6
7same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
8print(same_pad.get_shape()) # 输出为(1, 1, 2, 1)
对于'VALID'填充方式,我们不进行填充操作,直接对输入数据进行最大池化操作,得到输出的大小为[1, 1]。具体代码如下所示:
1import tensorflow as tf
2
3x = tf.constant([[1., 2., 3.],
4 [4., 5., 6.]])
5x = tf.reshape(x, [1, 2, 3, 1])
6
7valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')
8print(valid_pad.get_shape()) # 输出为(1, 1, 1, 1)
通过这个例子,我们可以清楚地看到'SAME'和'VALID'填充方式的差异。
总结
本文介绍了深度学习中的'SAME'和'VALID'填充方式,并通过例子进行了说明。'SAME'填充方式在卷积操作中会对输入数据进行填充,以确保输出大小与输入大小相同;'VALID'填充方式在卷积操作中不进行填充操作,输出大小会根据输入数据大小、卷积核大小以及步长进行计算。这些填充方式在实际深度学习任务中非常常用,希望本文对你有所帮助。
相关文章推荐
- <html>
- SQLAlchemy中的IN子句
- 如何确定Python中的对象是否可迭代
- 如何正确确定当前脚本所在目录
- 使用max()/min()函数获取列表中最大/最小元素的索引
- 将Pandas DataFrame转换为字典
- 创建Python 3.3+的软件包时是否需要__init__.py文件
- 在Python中隐藏子进程的输出
- 使用pandas对列进行排序的方法
- 如何检查变量的类型是否为字符串
- Python数据分析:使用pandas在Python 2.7中按多个列排序数据帧
- 从pandas数据帧的列或行获取列表
- Python中的defaultdict与普通字典的区别
- 在Python中加载文件夹中的所有模块
- 如何使用Python查找CPU数量
- 在Flask请求中获取接收到的数据
- 如何禁用Requests库的日志消息?
- 在Matplotlib中旋转坐标轴文本
- 如何以最Pythonic的方式删除一个可能不存在的文件
- 在Flask路由中如何访问查询字符串
- 如何从NumPy数组中删除NaN值?
- 逐行添加Pandas Dataframe
- 使用Python对包含元组的列表进行排序
- Python代码为什么在函数中运行更快?
- 使用.otf 字体在网页中
- 使用 pip 安装具有最小和最大版本范围的软件包
- 使用 Python 求多个集合的交集
- Python中定义类变量的正确方法