1、tf.layers.conv2d
import tensorflow as tf
# 设置输入形状为[1,5,5,1] 的随机矩阵
input = tf.Variable(tf.random_normal([1, 5, 5, 1]))
# 步长为 1 的卷积操作,一个选择'VALID'方式填充一个选择'SAME'方式填充
same_conv2d_s1 = tf.layers.conv2d(input, filters=1, kernel_size=3, strides=1, padding='SAME')
valid_conv2d_s1 = tf.layers.conv2d(input, filters=1, kernel_size=3, strides=1, padding='VALID')
# 步长为 2 的卷积操作,一个选择'VALID'方式填充一个选择'SAME'方式填充
same_conv2d_s2 = tf.layers.conv2d(input, filters=1, kernel_size=3, strides=2, padding='SAME')
valid_conv2d_s2 = tf.layers.conv2d(input, filters=1, kernel_size=3, strides=2, padding='VALID')
# run 运行,打印不同步长不同天秤方式下的形状变化
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print('strides == 1')
print(valid_conv2d_s1.get_shape())
print(same_conv2d_s1.get_shape())
print('strides == 2')
print(valid_conv2d_s2.get_shape())
print(same_conv2d_s2.get_shape())
2、tf.layers.max_pooling2d
import tensorflow as tf
# 定义一个两行三列的矩阵
x = tf.constant([[1., 2., 3.],
[4., 5., 6.]])
# 转换形状为tf.layers.max_pool所接受的形状(batch, height, width, channels)
x = tf.reshape(x, [1, 2, 3, 1])
# 设置tf.layers.max_pool进行最大池化,一个选择'VALID'方式填充一个选择'SAME'方式填充
# 卷积核大小为2*2,卷积步长为2
valid_pad = tf.layers.max_pooling2d(x, pool_size=2, strides=2, padding='VALID')
same_pad = tf.layers.max_pooling2d(x, pool_size=2, strides=2, padding='SAME')
# run运行,打印两种不同填充方式的结果:
# 一个效果为舍弃最后一列,一个填充一行
with tf.Session() as sess:
print('VALID:')
print(sess.run(valid_pad))
print('SAME:')
print(sess.run(same_pad))
# 打印形状shape
print('x.shape:')
print(x.get_shape())
print('valid_pad.shape:')
print(valid_pad.get_shape())
print('same_pad.shape:')
print(same_pad.get_shape())
3、tf.nn.conv2d
import tensorflow as tf
# 设置输入形状为[1,5,5,1] 的随机矩阵
input = tf.Variable(tf.random_normal([1, 5, 5, 1]))
# 设置卷积核的形状,3,3 输入的channels为1,输出channels为1
# [filter_height, filter_width, in_channels, out_channels]
filter = tf.Variable(tf.random_normal([3, 3, 1, 1]))
# 步长为 1 的卷积操作,一个选择'VALID'方式填充一个选择'SAME'方式填充
same_conv2d_s1 = tf.nn.conv2d(input, filter, [1, 1, 1, 1], padding='SAME')
valid_conv2d_s1 = tf.nn.conv2d(input, filter, [1, 1, 1, 1], padding='VALID')
# 步长为 2 的卷积操作,一个选择'VALID'方式填充一个选择'SAME'方式填充
same_conv2d_s2 = tf.nn.conv2d(input, filter, [1, 2, 2, 1], padding='SAME')
valid_conv2d_s2 = tf.nn.conv2d(input, filter, [1, 2, 2, 1], padding='VALID')
# run 运行,打印不同步长不同天秤方式下的形状变化
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print('strides == 1')
print(valid_conv2d_s1.get_shape())
print(same_conv2d_s1.get_shape())
print('strides == 2')
print(valid_conv2d_s2.get_shape())
print(same_conv2d_s2.get_shape())
4、tf.nn.max_pool
import tensorflow as tf
# 定义一个两行三列的矩阵
x = tf.constant([[1., 2., 3.],
[4., 5., 6.]])
# 转换形状为tf.nn.max_pool所接受的形状4-D张量。
x = tf.reshape(x, [1, 2, 3, 1])
# 设置tf.nn.max_pool进行最大池化,一个选择'VALID'方式填充一个选择'SAME'方式填充
# 卷积核大小为2*2,卷积步长为2
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')
# run运行,打印两种不同填充方式的结果:
# 一个效果为舍弃最后一列,一个填充一行
with tf.Session() as sess:
print('VALID:')
print(sess.run(valid_pad))
print('SAME:')
print(sess.run(same_pad))
# 打印形状shape
print('x.shape:')
print(x.get_shape())
print('valid_pad.shape:')
print(valid_pad.get_shape())
print('same_pad.shape:')
print(same_pad.get_shape())