对卷积的再次认识(好久不看忘了)

直接上代码吧 涉及到到卷积的一些基本知识可以看 我的另一篇总结 https://mp.csdn.net/postedit/103395044

import tensorflow as tf
import numpy as np
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"

#使用numpy工具初始化一个名为M的数组,形状为2x3,数据类型为float32
#并使用numpy的reshape()函数调整输入的格式
#注意,M不会被TensorFlow识别为张量
M = np.array([[[2],[1],[2],[-1]],
              [[0],[-1],[3],[0]],
              [[2],[1],[-1],[4]],
              [[-2],[0],[-3],[4]]],dtype="float32").reshape(1, 4, 4, 1)

print('原始图片:\n',M)
#通过get_variable()函数创建过滤器的权重变量,上面介绍了卷积层
#这里声明的参数变量是一个四维矩阵,前面两个维度代表了过滤器的尺寸,
#第三个维度表示当前层的深度,第四个维度表示过滤器的深度。
filter_weight = tf.get_variable("weights",shape=[2, 2, 1, 1],
    initializer = tf.constant_initializer([[-1, 4],[2, 1]]))


#通过get_variable()函数创建过滤器的偏置项,代码中[1]表示过滤器的深度。
#等于神经网络下一层的深度。
biases = tf.get_variable("biase", [1], initializer = tf.constant_initializer(1))


x = tf.placeholder('float32', [1,None, None,1])

#conv2d()函数实现了卷积层前向传播的算法。
#这个函数的第一个参数为当前层的输入矩阵,注意这个矩阵应该是一个四维矩阵,
#代表第一个维度的参数对应一个输入batch。如果在输入层,input[0, , , ]表示第一张图片,
#input[1, , , ]表示第二张图片,等等。函数第二个参数是卷积层的权重,第三个参数为
#不同维度上的步长。虽然第三个参数提供的是一个长度为4 的数组,
#但是第一个和最后一个数字要求一定是1,这是因为卷积层的步长只对矩阵的长和宽有效。
#最后一个参数是填充(padding的方法,有SAME或VALID 两种选择,
#其中SAME 表示添加全0填充,VALID表示不添加。
#函数原型conv2d(input,filter,strids,padding,us_cudnn_on_gpu_,data_format,name)
conv = tf.nn.conv2d(x, filter_weight, strides=[1, 1, 1, 1], padding="SAME")

#bias_add()函数具有给每一个节点加上偏置项点功能。这里不能直接使用加法的原因是
#矩阵上不同位置上的节点都需要加上同样的偏置项。因为过滤器深度为1,
#故偏置项只有一个数,结果为3x4的矩阵中每一个值都要加上这个偏置项。
#原型bias_add(value,bias,data_format,name)
add_bias = tf.nn.bias_add(conv, biases)

init_op=tf.global_variables_initializer()
with tf.Session() as sess:
    init_op.run()
    print("偏置:",sess.run(biases))
    M_conv=sess.run(add_bias, feed_dict={x: M})
    print("权重:\n",sess.run(filter_weight))
    #输出结果并不是一个张量,而是数组
    print("M after convolution: \n", M_conv)

结果如下:

原始图片:
 [[[[ 2.]
   [ 1.]
   [ 2.]
   [-1.]]

  [[ 0.]
   [-1.]
   [ 3.]
   [ 0.]]

  [[ 2.]
   [ 1.]
   [-1.]
   [ 4.]]

  [[-2.]
   [ 0.]
   [-3.]
   [ 4.]]]]


偏置: [1.]
权重:
 [[[[-1.]]

  [[ 4.]]]


 [[[ 2.]]

  [[ 1.]]]]
M after convolution: 
 [[[[  2.]
   [  9.]
   [  1.]
   [  2.]]

  [[  2.]
   [ 15.]
   [  0.]
   [  9.]]

  [[ -1.]
   [ -7.]
   [ 16.]
   [  5.]]

  [[  3.]
   [-11.]
   [ 20.]
   [ -3.]]]]

下面解释如何计算出来的结果:

    

上面的原始图片打印出来是一个通道的,我们需要自己转成图片(我在excel表格弄得不太好看),下面是一张灰度图

      

因为是"SAME"填充,输入图片的长和高是4*4; 卷积核的高和长是2*2;步长是1*1的计算出来的p是1/2

也就是需要填充的方格是一边是1/2,1/2怎么填充,我们可以将1/2都移到一边。具体移动到那一边呢,需要自己尝试一下

经过尝试,绿色的是正确的

举个运算的例子(2*-1+1*4+0*2+1*-1=1,然后加上偏置1结果是2)

卷积后的结果如下,我们可以继续计算验证一下结果

   

上面的代码程序参考的是蒋子阳的《Tensorflow深度学习算法原理与编程实践》

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值