基础篇


1.导入相关的库




ImageSearcher使用 image.nearest_numpy



理解点:


(1)plt.rcParams['figure.figsize'] = (5,4)是设置显示图像的最大范围。


(2)plt.rcParams['image.interpolation'] = 'nearest'是设置差值方式为'nearest',按照英文意思应该指图像是以距离最近的方式进行插补。


(3)plt.rcParams['image.cmap'] = 'gray'是设置灰度空间,灰度空间相关介绍见链接: https://www.jianshu.com/p/84b825b9e8a3


(4)load_ext autoreload是 自动重新加载更改的模块,相关的介绍见链接: https://zhidao.baidu.com/question/1993555579602833947.html


(5)plt.rcParams是一个字典格式,字典中存放了很多关于图像显示参数,比如中文显示等。


2.卷积神经网络实现的框架图



ImageSearcher使用 image.nearest_ImageSearcher使用_02



先进行数据卷积处理(CONV),再进行数据激活处理(RELU),再进行池化处理(POOL),再进行完全连接(FC)转化成一维数据中的神经网络算法进行数据训练得到模型。


3.数据卷积处理


对数据进行卷积处理是为了将数据的维度进行减少,从而减少参数的数量,加快模型训练数据的速度。



ImageSearcher使用 image.nearest_numpy_03



3.1Zero-Padding


Zero-Padding是通过在图像数据边界加0扩充原始数据维度从而使得现在卷积后的数据维度保持不变,其作用归纳如下:


(1)在使用卷积时无需缩小卷积的高度和宽度,使得可以构建更深的神经网络,否则在走向更深层时,卷积层的高度和宽度会缩小。


(2)有助于将更多的信息保存在图像的边界,如果没有进行数据填充(zero-padding),下一层的极少数值将会受到像素边缘的影响。



ImageSearcher使用 image.nearest_numpy_04



python代码实现:



ImageSearcher使用 image.nearest_吴恩达老师_05



结果示例:



ImageSearcher使用 image.nearest_CNN_06



理解点:


(1)python函数np.pad(X,((pad_1,pad_1),(pad_2,pad_2),(pad_3,pad_3),(pad_n,pad_n)),'constant',constant_values = 0)是对数据集X进行每个维度进行填充,函数内部的pad_i是对第i维的左右进行填充规格设置,'constant'是规定运用常量进行填充,constant_values是对该常量进行设置。该函数的详细介绍见链接:


(2)定义的zero_pad(X,pad)函数参数X是数据集,pad是进行数据填充的规格,即在规定的维度中填充的行数和列数。通过上述代码示例可直观理解其中含义。


3.2卷积处理核心步骤


通过设定的过滤器(过滤器中的数值即是参数,可认为是W),过滤器对原始的维度数据进行遍历计算总和。



ImageSearcher使用 image.nearest_吴恩达老师_07



在此图中,5x5的是输入向量,黄色3x3的是参数向量,通过逐一的遍历计算和,得到一个3x3维度的数据集,即是经过卷积处理的数据。


python代码实现:



ImageSearcher使用 image.nearest_tensorflow_08



理解点:


(1)该函数定义的输入参数a_slice_prev是输入数据的一个切片,W是参数数据,b是一个偏差值,作用与BP神经网络中的b一样。


(2)np.multiply()函数作用是将两个矩阵对应的元素相乘得到一个新矩阵s,np.sum(s)是将矩阵s中的数据进行加总。


3.3卷积神经网络的前向传递过程


3.3.1相关数据维度的数量规律特点:



ImageSearcher使用 image.nearest_吴恩达老师_09



其中:


n_H和n_W分别是过滤后数据集的高度和宽度;


n_H_prev和n_W_prev分别是原始数据集的高度和宽度;


f是过滤器的规格,一般过滤器是方阵


pad是填充的数据规格


stride是进行移步计算时移动的步数


n_c是过滤器的数量


3.3.2对数据进行切片处理



ImageSearcher使用 image.nearest_吴恩达老师_10



3.3.3模型构建



ImageSearcher使用 image.nearest_CNN_11



理解点:


(1)函数参数A_prev是输入数据集,W是参数矩阵(包含了过滤器信息),b是偏差,与上面提及的b作用一致,hparameters是超参数字典,包含了pad值与stride值等。


(2)A_prev的规格参数m是指数据进行了mini-batch分割后得到的数据子集的数量m,n_H_prev和n_W_prev是每个batch的高度和宽度,n_C_prev是每个mini-batch数据集的层数。


(3)W规格参数f是每个过滤器的高度和宽度,因是方阵,所以两者相同,n_C_prev和A_prev中的是一致的并且必须保持一致,n_C是过滤器的数量,所以W参数矩阵中总共有f*f*n_C_prev*n_C个参数。加上n_C个b,所以在卷积神经网络中总共有f*f*n_C_prev*n_C+n_C个参数。


(4)n_H和n_W是根据以上参数结合公式计算得到的经过滤后后的数值矩阵的高度和宽度。


(5)首先运用循环对每个mini-batch数据进行处理.


(6)后面三个循环的顺序如图所示



ImageSearcher使用 image.nearest_ImageSearcher使用_12



进行切片处理的核心是先确认初始点,再运用stride和f确定末尾点进行切割。


(7)在计算Z时是对每一层进行计算加和,再对层进行循环计算得到每个初始点对应的Z值。循环结束即可更新完Z,得到经过卷积处理后的Z。


(8)将函数的各参数进行保存至cache,函数返回卷积结果Z和参数cache。


4.数据池化处理


池化层(POOL)降低输入的宽度和高度,有助于减少计算量,池化方法可分为最大池化法和平均池化法:



ImageSearcher使用 image.nearest_CNN_13




ImageSearcher使用 image.nearest_numpy_14



注:池化层没有参数需要进行反向传播训练。


经过池化的数据维度格式计算公式为



ImageSearcher使用 image.nearest_tensorflow_15



python代码实现:



ImageSearcher使用 image.nearest_吴恩达老师_16



理解点:


(1)利用卷积函数中的切片循环结构进行选择数据切片,对每个切片进行取大或求均值处理得到一个数值,该数值存放在A变量与进行切片时的初始相同位置,即每一个A[i,h,w,c]。


(2)此函数与卷积函数的一个区别为在循环结构中没有先将mini-batch中的每个batch进行选取,并且在切片选取时进行了逐层选取,即a_prev_slice = A_prev[i,vert_start:vert_end,horiz_start:horiz_end, c ].


Tensorflow实现篇


1.前期准备


1.1导入相关的库



ImageSearcher使用 image.nearest_numpy_17



理解点:


(1) Image 模块提供了一个同名类(Image),也提供了一些工厂函数,包括从文件中载入图片和创建新图片,PIL详细介绍见链接:


(2)scipy.ndimage的相关介绍:


1.2数据导入



ImageSearcher使用 image.nearest_tensorflow_18



1.3数据处理



ImageSearcher使用 image.nearest_ImageSearcher使用_19



2.创建占位符



ImageSearcher使用 image.nearest_numpy_20



理解点:


(1)此处shape的None是与mini-batch中的batch_size对应。


3.参数初始化



ImageSearcher使用 image.nearest_吴恩达老师_21




ImageSearcher使用 image.nearest_numpy_22



函数涉及的相关函数介绍可查看‘Andrew NG Tensorflow’篇相关介绍


4.向前传导机制



ImageSearcher使用 image.nearest_numpy_23



函数测试



ImageSearcher使用 image.nearest_tensorflow_24



理解点:


(1)tf.nn.conv2d(X,W1,strides=[1,1,1,1],padding='SAME')是将W1作为参数对X进行卷积运算,其中在X_shape([m,n_h,n_w,n_c])上的移动步幅都是1,与strides相对应,padding = 'SAME'表示对数据进行扩充使得到的数据集维度与原数据集维度一致。函数相关详细介绍见链接:


(2)tf.nn.relu(Z1)是对Z1进行relu反正切运算。


(3)tf.nn.max_pool(A1,ksize=[1,8,8,1],strides = [1,8,8,1],padding = 'SAME')是对A1进行最大池化处理,选择池化窗口维度为[8,8],一般的只对高度和宽度进行池化,不对batch和channels进行池化,池化移动步长也是[8,8],即没进行一次池化高度和宽度移动8步,padding与卷积运算规则一致,函数详细介绍见链接:


(4)在进行两次卷积、池化和激活运算后,对维度减少的数据运用tf.contrib.layers.flatten(p2)进行展开成一列的维度数据,从而可进行无卷积的神经网络训练。


(5)tf.contrib.layers.fully_connected(P2,6,activation_fn = tf.nn.softmax)是对数据训练实现完全连接。此函数是对数据集P2进行神经网络训练,输出单元数为6的输出层,此时运用的激活函数是softmax进行多分类。函数详细介绍见链接: https://tensorflow.google.cn/api_docs/python/tf/contrib/layers/fully_connected


(6)运用tensorflow进行卷积神经网络运算的一般流程为:卷积运算 >> 激活运算 >> 池化处理 >> ...(相关循环)...>> 数据整合成一维 >> 实现数据全连接(即进行常规的神经网络前向传导)。


(7)在进行结果的运算实现中,需要先对全局变量进行初始化,谨记对tensorflow中的语句进行调用实现的一般流程方法。在进行模型的run()过程中,X与Y的赋值是将训练数据的预测变量与被预测变量代入模型进行参数训练。


5.损失函数的计算



ImageSearcher使用 image.nearest_ImageSearcher使用_25



损失函数的计算介绍可见‘Andrew NG Tensorflow’篇。


6.模型构建



ImageSearcher使用 image.nearest_ImageSearcher使用_26



理解点:


(1)ops.reset_default_graph()是清除默认的堆栈,具体含义不清楚,但一定要在程序之前有此语句才能运行,所以暂时需要记忆。


(2)cost=[]是首先建一个cost空列表用于储存每次迭代产生的损失函数值。


(3)实现卷积函数的代码只有三行,第一行是将X与Y运用维度信息进行设置占位符,第二行将参数进行初始化,第三行是将初始化后的参数和预测变量X代入卷积神经网络前向传播函数计算得到Z值,此时的Z值已经过完全连接处理,与非卷积神经网络得到的Z一致。


(4)通过神经网络训练得到的Z与实际被预测值Y计算得到损失函数值,并根据优化方法和学习率进行反向传播对参数进行训练使得损失函数达到全局最优,关于参数优化tensorflow方法见“Andrew NG Tensprflow”篇。


(5)tf.global_variables_initializer()是对全局变量的初始化,具体介绍见“Andrew NG Tensorflow”篇。


(6)后期的神经网络训练构建与tensorflow实现BP神经网络模型一致,详细介绍见“Andrew NG Tensorflow”篇。