Tensorflow的卷积神经网络的矩阵生成详解

最近在学习deep leaning发现了不少坑,尤其是你对矩阵乘法不理解的时候项深入看懂一些代码真的很难,我这次分享的是我个人用tensorflow写的一个简单的卷积神经网络的矩阵生成方法的详解,包括对矩阵的生成,sobel算子的生成,多channel时对sobel算子的生成,在我下面介绍的例子中都会有说明,大家可以参考理解。
先来看看我想说明的代码:

import tensorflow as tf
input1 = tf.Variable(tf.constant(1.0, shape=[1, 5, 5, 1]))
input2 = tf.Variable(tf.constant(1.0, shape=[1, 5, 5, 2]))
input3 = tf.Variable(tf.constant(1.0, shape=[1, 4, 4, 1]))
filter1 = tf.Variable(tf.constant([-1.0, 0, 0, -1],
                                  shape=[2, 2, 1, 1]))
filter2 = tf.Variable(tf.constant([-1.0, 0, 0, -1,
                                   -1.0, 0, 0, -1],
                                  shape=[2, 2, 1, 2]))
filter3 = tf.Variable(tf.constant([-1.0, 0, 0, -1, 
                                   -1.0, 0, 0, -1,
                                   -1.0, 0, 0, -1],
                                  shape=[2, 2, 1, 3]))
filter4 = tf.Variable(tf.constant([-1.0, 0, 0, -1,
                                   -1.0, 0, 0, -1, 
                                   -1.0, 0, 0, -1,
                                   -1.0, 0, 0, -1],
                                  shape=[2, 2, 2, 2]))
filter5 = tf.Variable(tf.constant([-1.0, 0, 0, -1,
                                   -1.0, 0, 0, -1],
                                  shape=[2, 2, 2, 1]))

strides = [1, 2, 2, 1]

op1 = tf.nn.conv2d(input1, filter1, strides=strides, padding='SAME')
op2 = tf.nn.conv2d(input1, filter2, strides=strides, padding='SAME')
op3 = tf.nn.conv2d(input1, filter3, strides=strides, padding='SAME')
op4 = tf.nn.conv2d(input2, filter4, strides=strides, padding='SAME')
op5 = tf.nn.conv2d(input2, filter5, strides=strides, padding='SAME')

vop1 = tf.nn.conv2d(input1, filter1, strides=strides, padding='VALID')
op6 = tf.nn.conv2d(input3, filter1, strides=strides, padding='SAME')
vop6 = tf.nn.conv2d(input3, filter1, strides=strides, padding='VALID')

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    
    print("op1:\n", sess.run([op1, filter1]))
    print("--------------------------")
    
    print("op2:\n", sess.run([op2, filter2]))
    print("op3:\n", sess.run([op3, filter3]))
    print("--------------------------")
    
    print("op4:\n", sess.run([op4, filter4]))
    print("op5:\n", sess.run([op5, filter5]))
    print("--------------------------")
    
    print("op1:\n", sess.run([op1, filter1]))
    print("vop1:\n", sess.run([vop1, filter1]))
    print("op6:\n", sess.run([op6, filter1]))
    print("vop6:\n", sess.run([vop6, filter1]))

这段代码是我在《深度学习之Tensorflow》这本书上抄下来的,作者是李金洪,书比较不错代码都很全。这段代码可以直接运行,但是你若是取仔细理解这些代码你会发现你在矩阵生成这一个块就读不下去,因为我就是这么过来的。小白很难理解这些矩阵(matrix)到底是如何生成,即使是学过《线性代数》这门课也比较难读懂,原因有很多,其中我觉得最大的原因可能是这些所谓的matrix其实与你所在《线代》这门课里所认识的有所不一样,但是大同小异,首先我得把这个差异给你们说清楚,不然看完下面的图看了也不能很好的理解。
你在《线代》里接触的所有matrix一定不会出现[[]]这种两层中括号包括起来的matrix,一定指挥使用单层[]包裹的一堆数字,但是在所有的neural network编程里你会看到很对类似这种多层[]包裹起来的matrix,这些其实是可以按维度来分开,具体怎么分你们可以看我下面的例子自己举一反三,因为我实在是叙述不出来。。。如:[[[2, 5, 9], [8, 7, 6], [1, 5, 9]], [[7, 7, 8], [4, 5, 6]]]这是一个三维张量,因为最外层有3个"[[[",然后我们可以看“[[[”中的第二个[所包含的数据,这是一个33的矩阵,然后我们再看另一个第二层[包裹的数据,可以看出他是个23的矩阵,所以该如何划分你应该看懂了吧,这个例子是一个三维张量(tensor),内部有两个向量(vector,及二维张量)所组成的一个矩阵,这种矩阵我想你在学《线代》的时候老师一定说过,这个种matrix是一种划分matrix内部元素组成新元素的过程,所以你不知道这一步你就对上面代码里的shape不了解,那么有了这个基础我们可以看一下shape是如何重新筛选matrix的,这里我就以一张自己画的思维流图作为给你们的参照,图是以代码中的op5作为讲解对象所画的,图片如下:
Tensorflow的卷积神经网络的矩阵生成详解
这个是我对上面代码其中的一个矩阵生部分的图解流程,我觉得我画的非常明白,如有疑问可以留言,我尽力解答,毕竟我也是刚学不久,只是有点感触所以发个博客分享一下自己学习的经验。这里我有可能写错了一些概念,有错误还请各位指出来我修改