卷积函数小例子

"""
TensorFlow中的卷积函数
函数: tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
1. input: 卷积的输入图像,是一个4维的Tensor,类型为float32和float64其中之一,其中Tensor为[训练时一个batch的图片数量,
图片高度,图片宽度,图片通道数]
2. filter: 卷积核,是一个4维的Tensor,[卷积核高度,卷积核宽度,图片通道数,卷积核个数],其中的图片通道数其实是input的
第4维
3. strides: 卷积时图像在每一维的步长,第一维和第四维默认为1,第二维和第三维是平行和竖直滑行的步长
4. padding: 卷积方式,取值为"SAME"和"VALID"其中之一
5. use_cudnn_on_gpu: 是否使用cudnn加速,默认True
"""
import tensorflow as tf

"""
假设输入一张单通道大小为3x3的图片,并使用一个[1, 1, 1, 1]大小的卷积核对其操作
"""
input = tf.Variable(tf.random_normal([1, 3, 3, 1]))
filter = tf.Variable(tf.ones([1, 1, 1, 1]))  # 这个卷积核并不会改变原图片

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

conv2d = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding="VALID")
print(sess.run(conv2d))
print(sess.run(input))
sess.close()

"""
将图片替换为一张5通道图像,则需要是使用的卷积核为[1, 1, 5, 1],得到的将仍然为3x3的矩阵
"""
input = tf.Variable(tf.truncated_normal([1, 3, 3, 5]))
filter = tf.Variable(tf.ones([1, 1, 5, 1]))

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
conv2d = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding="VALID")
print(sess.run(conv2d))
print(sess.run(filter))
print(sess.run(input))
sess.close()

"""
对图片和卷积核做个修改,使用3x3的卷积核,图片为5x5的5通道,步长为1,输出3x3特征值
"""
input = tf.Variable(tf.truncated_normal([1, 5, 5, 5]))
filter = tf.Variable(tf.ones([3, 3, 5, 1]))

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

conv2d = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding="VALID")
print(sess.run(conv2d))

conv2d_same = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding="SAME")  # 这样会使卷积结果和原输入矩阵大小一致
print(sess.run(conv2d_same))
sess.close()

你可能感兴趣的:(python,tensorflow)