函数原型:
tf.nn.conv2d( input, filter, strides, padding, use_cudnn_on_gpu=True, data_format='NHWC', dilations=[1, 1, 1, 1], name=None, )
前面的 input(原始图形4维),filter(卷积核4维),strides(滑动步长 4维),padding 注释如下.
#卷积层
def conv2d(x,W):
#x input tensor of shape `[batch, in_height, in_width, in_channels]`
#W filter / kernel tensor of shape [filter_height, filter_width, in_channels, out_channels]
#`strides[0] = strides[3] = 1`. strides[1]代表x方向的步长,strides[2]代表y方向的步长
#padding: A `string` from: `"SAME", "VALID"`
return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')
卷积知识补充:
在卷积神经网络中有一个重要的概念:深度
卷积层
卷积:在原始的输入上进行特征的提取。特征提取简言之就是,在原始输入上一个小区域一个小区域进行特征的提取,稍后细致讲解卷积的计算过程。
上图中,左方块是输入层,尺寸为32*32的3通道图像。右边的小方块是filter,尺寸为5*5,深度为3。将输入层划分为多个区域,用filter这个固定尺寸的助手,在输入层做运算,最终得到一个深度为1的特征图。
上图中,展示出一般使用多个filter分别进行卷积,最终得到多个特征图。
上图使用了6个filter分别卷积进行特征提取,最终得到6个特征图。将这6层叠在一起就得到了卷积层输出的结果。
==========================================================================
实例:
基于mnist数据集测试,图形化查看卷积运算结果.
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
# 读入数据
mnist = input_data.read_data_sets("../../MNIST_data/", one_hot=True)
#定义一个卷积运算的函数
def conv2d(x,W):
return tf.nn.conv2d(x,W,[1,1,1,1],"SAME")
#定义一个初始化shape 变量的函数
def shape_var(shape):
#
tmp_w = tf.truncated_normal(shape,stddev=0.1)
return tf.Variable(tmp_w)
#查看原始图片
img = mnist.train.images[1]
# 把从mnist数据集中取出的图形转为 2维图形
img2 = img.reshape([28,28])
plt.imshow(img2)
#卷积运算
#转出 conv2d 函数需要的 shape 型 变量.
# 这里img 只有一张图片,所以最终shape为[1,28,28,1],28x28的1通道图片
img_conv = tf.reshape(img,[-1,28,28,1])
# 定义卷积核,3x3 单通道输入,32通道输出. 可以认为有32个卷积核.每个卷积核为 3x3 矩阵.
w = shape_var([3,3,1,32])
#卷积运算,步长为1
timg3 = tf.nn.conv2d(img_conv,w,[1,1,1,1],"SAME")
#运行
sess.run(tf.global_variables_initializer())
img3 = sess.run(timg3)
#查看每个通道输出的图形,这里只看前10个.
for i in range(10): #可以到 32
print(i)
# 取出第几维数据
img3_1 = img3[:,:,:,i]
img3_11 = img3_1.reshape([28,28])
#print(img3_1.shape)
plt.imshow(img3_11)
plt.show()
输出原始图片:
:
卷积后图片: 可以看到不同的特征
0
1
2
3
4
5
6
7
8
9