ConvolutionalNeuralNetwork网络结构图图2卷积神经网络结构图卷积神经网络和全连接神经网络结构区别比较大。相邻两层的节点通过边相连,但在卷积神经网络中,只有部分相邻节点相连。全连接神经网络处理图像最大的问题是全连接层的参数太多。如果参数过多,容易过拟合,降低计算速度。卷积神经网络可以减少参数的数量。假设输入是一张28*28*3大小的图片,第一层隐藏层有500个节点,那么第一层的参数有28*28*3*500+500=1176000个参数,当图片越大,参数越多,这只是第一层。那么为什么卷积神经网络可以达到减少参数的目的呢?最关键的卷积神经网络是卷积层、池化层和全连接层。卷积层卷积层中每个节点的输入只是神经网络上一层的一小块,通常由一个卷积核来实现。卷积核是一个filter,可以想象成一个扫描窗口,在图片上,然后按照设定的sizestep等对图片进行扫描,计算规则是乘以扣除图像的像素矩阵与相应位置的权重卷积核进行求和,得到每次扫描的输出。卷积层所做的工作可以理解为对每一小块图像像素的特征抽象。同一张图片可以由多个不同的卷积核进行卷积。卷积核的个数实际上就是卷积后输出矩阵的深度。卷积神经网络的参数个数与图像的大小无关,只与滤波器的大小和深度以及卷积核的个数(输出矩阵的深度)有关。假设还是一张28*28*3的图片,卷积核的大小设置为3*3*3,输出矩阵的深度为500,那么参数个数为3*3*3*500+500=14000个参数,与全连接层相比,参数减少了很多。图3.生动的卷积层示例池化层池化层可以看作是将高分辨率图片转换为低分辨率图片。可以有效减小矩阵的尺寸,从而减少全连接层的参数个数,加快计算速度,同时防止过拟合和池化,可以减少模型,提高速度,提高提取特征的鲁棒性。粘性。使用2*2的filter,步长为2,***pooling如下图所示:图42*2的filter***pooling示例图我们可以把卷积层和pooling层看成自动特征提取很好。通过上面直观的介绍,现在我们知道为什么卷积神经网络可以达到减少参数的目的了吧?与全连接神经网络相比,卷积神经网络的优势在于共享权重和稀疏连接。共享权重是参数只与过滤器相关。卷积神经网络减少参数的另一个原因是稀疏连接。输出节点与输入图像矩阵的像素矩阵部分有关,即与卷积核减去的小矩阵有关。这就是稀疏连接的概念。卷积神经网络通过权重共享和稀疏连接来减少参数。从而防止过拟合。训练过程卷积神经网络的训练过程大致分为以下几个步骤:第一步:导入相关库,加载参数importmathimportnumpyasnpimporttensorflowastfimportmatplotlib.pyplotaspltimpporth5pyfromtensorflow.python.frameworkimportopsfromtf_utilsimport*np.random.seed(1)X_train_orig,Y_train_orig,X_test_origY_test_orig,classes=load_dataset()index=0plt.imshow(X_train_orig[index])print("y="+str(np.squeeze(Y_train_orig[:,index])))plt.show()第二步:返回一个,有利于加速梯度下降X_train=X_train_orig/255.0X_test=X_test_orig/255.0Y_train=convert_to_one_hot(Y_train_orig,6)Y_test=convert_to_one_hot(Y_test_orig,6)第三步:定义参数和卷积神经网络结构defcreate_placeholder(num_px,通道,n_y):X=tf.placeholder(tf.float32,shape=(None,num_px,num_px,channel),name='X')Y=tf.placeholder(tf.float32,shape=(None,n_y),name='Y')returnX,YX,Y=create_placeholder(64,3,6)print("X="+str(X))print("Y="+str(Y))defweight_variable(shape):returntf.Variable(tf.truncated_normal(shape,stddev=0.1))defbias_variable(shape):returntf.Variable(tf.constant(0.1,shape=shape))defconv2d(x,W):returntf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME')defmax_pool_2x2(x):returntf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')definitialize_parameters():w_conv1=weight_variable([5,5,3,32])b_conv1=bias_variable([32])w_conv2=weight_variable([5,5,32,64])b_conv2=bias_variable([64])w_fc1=weight_variable([16*16*64,512])b_fc1=bias_variable([512])w_fc2=weight_variable([512,6])b_fc2=bias_variable([6])parameters={"w_conv1":w_conv1,"b_conv1":b_conv1,"w_conv2":w_conv2,"b_conv2":b_conv2,"w_fc1":w_fc1,"b_fc1":b_fc1,"w_fc2":w_fc2,"b_fc2":b_fc2}返回参数第四步:前行传播过程defforward_propagation(X,parameters):w_conv1=parameters["w_conv1"]b_conv1=parameters["b_conv1"]h_conv1=tf.nn.relu(conv2d(X,w_conv1)+b_conv1)h_pool1=max_pool_2x2(h_conv1)w_conv2=参数["w_conv2"]b_conv2=参数["b_conv2"]h_conv2=tf.nn.relu(conv2d(h_pool1,w_conv2)+b_conv2)h_pool2=max_pool_2x2(h_conv2)w_fc1=参数["w_fc1"]b_fc1=参数["b_fc1"]h_pool2_flat=tf.reshape(h_pool2,[-1,16*16*64])h_fc1=tf.nn.relu(tf.matmul(h_pool2_flat,w_fc1)+b_fc1)#keep_prob=tf.placeholder(tf.float32)#h_fc1_drop=tf.nn.dropout(h_fc1,keep_prob)w_fc2=参数["w_fc2"]b_fc2=parameters["b_fc2"]y_conv=tf.matmul(h_fc1,w_fc2)+b_fc2returny_conv第五步:生成本函数defcompute_cost(y_conv,Y):cost=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits)y_conv,labels=Y))returncost第六步:坡度下降更新参数defrandom_mini_batches1(X,Y,mini_batch_size=64,seed=0):m=X.shape[0]#numberoftrainingexamplesmini_batches=[]np.random.seed(seed)Y=Y.T#(1080,6)#Step1:Shuffle(X,Y)permutation=list(np.random.permutation(m))shuffled_X=X[排列,:,:,:]shuffled_Y=Y[排列,:].reshape((m,Y.shape[1]))#Step2:分区(shuffled_X,shuffled_Y).Minustheendcase.num_complete_minibatches=math.floor(m/mini_batch_size)#numberofminibatchesofsizemini_batch_sizeinyourpartitionningforkinrange(0,num_complete_minibatches):mini_batch_X=shuffled_X[k*mini_batch_size:k*mini_batch_size+mini_batch_size,:,:,:]mini_batch_Y=shuffled_Y[k*mini_batch_size:k*mini_batch_size+mini_batch_size,:]mini_batchX=(,mini_batch_Y)mini_batches.append(mini_batch)#Handlingtheendcase(lastmini-batch
