首页 > 编程知识 正文

卷积神经网络的卷积过程,卷积神经网络 卷积

时间:2023-05-04 21:45:01 阅读:267910 作者:4179

看了很多资料,三维卷积的计算都是如图一所示,但是自己上次验证的结果却不满足图一的运算规则,今天手动验证了一下,三维卷积的运算规则就是按图一所示。只能说python对矩阵的计算应该还不够强大吧,哎,或者是自己代码写错了。。。
对于卷积神经网络中的计算,大部分人所知道的计算如图一所示:卷积核中的各参数与图像矩阵相应位置的数值相乘后再求和。但是实际计算时图像往往是rgb图像,即图像有三个通道,每张输入图像有三个二维矩阵(也说图像的深度为3),而且卷积核的数量也不止一个,所以在实际计算中是每个卷积核分别与矩阵的不同通道计算再加和,还是卷积核与所以通道同时计算,还是有其它的计算规则呢?有些人给出的解释如图二所示,为了验证图二的卷积计算过程用tensorflow(tf.nn.conv2d())进行了实验,但是实验结果却和图二不一致,反而更像是按图三的计算规则进行的,请大神们给予指导


图一

图二

经实验得到的卷积计算规则:
每一个(共五个:自己选取的数量)卷积核中的每一个通道(三个:由输入图像的通道数决定)分别与输入图像的三个通道相乘加和,也就是每个卷积核进行了3x3=9次运算加和后得到特征图中的一个像素点。

图三(2)

图三(b)
以下是验证过程:
实验用输入图像:(图像尺寸:28x28x3)

借助tensorflow对图像进行卷积操作,代码如下:

在这里插入import tensorflow as tffrom skimage import ioimport numpy as npnp.set_printoptions(threshold=10000000)def weight_variable(shape): #定义卷积核 inital=tf.truncated_normal(shape,dtype=tf.float32) return tf.Variable(inital)def conv2d(x,w): #定义卷积操作 return tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='VALID')image=io.imread('./bike.jpg') #读取图像,得到图像矩阵 28*28*3xs=tf.cast(image,dtype=tf.float32) #转换图像矩阵格式x_image=tf.reshape(xs,[-1,28,28,3]) #改变图像尺寸weight=weight_variable([3,3,3,5]) #生成权重参数 3*3*3*5:前两个3表示二维卷积核的尺寸,第三个3表示输入图像矩阵的深度,也是生成卷积核的深度,5表示卷积核的数量sess=tf.Session()sess.run(tf.global_variables_initializer()) #初始化print('weight:',sess.run(weight)) #输出权重值print(weight.shape) #输出权重矩阵尺寸res=sess.run(conv2d(x_image,weight)) #对图形进行卷积操作print('feature_map:',res) #输出卷积后的图像矩阵

输入的图像是rgb图,将生成的图像矩阵提取到表格中,得到“三个二维矩阵”,如图所示:
R通道矩阵:

G通道矩阵:

B通道矩阵:

weights:(3x3x3x5)
结合下面的卷积核矩阵:第一个3对应3个“[[[ ]]]”,第二个3对应每个“[[[ ]]]”中的3个“[[ ]]”,第3个三对应每个“[[ ]]”中的3个“[ ]”,5对应每个“[ ]”中的5个数值。3x3x3x5表示有5个3x3x3的卷积核(因为输入图像是3,所以每个卷积核的深度是3)。

通过卷积核矩阵,提取第一个卷积核的值到表格中(三个通道,所以三个表格。)



由于得到的特征图(26x26x5)矩阵太长,下面只放出每个(共5个)特征图的第一行的各列(其中第一列为第一张特征图第一行的各列,共26列):

取特征图中的两个数进行验证(标绿的数字):


经过计算,发现计算规则更接近于文章开头图三所示的规则。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。