怎样用python构建一个卷积神经网络模型?

怎样用python构建一个卷积神经网络模型


慕姐4208626
浏览 1927回答 1
1回答

慕标5832272

上周末利用python简单实现了一个卷积神经网络,只包含一个卷积层和一个maxpooling层,pooling层后面的多层神经网络采用了softmax形式的输出。实验输入仍然采用MNIST图像使用10个feature map时,卷积和pooling的结果分别如下所示。部分源码如下:[python]&nbsp;view plain&nbsp;copy#coding=utf-8&nbsp;&nbsp;'''''&nbsp;Created&nbsp;on&nbsp;2014年11月30日&nbsp;@author:&nbsp;Wangliaofan&nbsp;'''&nbsp;&nbsp;import&nbsp;numpy&nbsp;&nbsp;import&nbsp;struct&nbsp;&nbsp;import&nbsp;matplotlib.pyplot&nbsp;as&nbsp;plt&nbsp;&nbsp;import&nbsp;math&nbsp;&nbsp;import&nbsp;random&nbsp;&nbsp;import&nbsp;copy&nbsp;&nbsp;#test&nbsp;&nbsp;&nbsp;from&nbsp;BasicMultilayerNeuralNetwork&nbsp;import&nbsp;BMNN2&nbsp;&nbsp;def&nbsp;sigmoid(inX):&nbsp;&nbsp;if&nbsp;1.0+numpy.exp(-inX)==&nbsp;0.0:&nbsp;&nbsp;return&nbsp;999999999.999999999&nbsp;&nbsp;return&nbsp;1.0/(1.0+numpy.exp(-inX))&nbsp;&nbsp;def&nbsp;difsigmoid(inX):&nbsp;&nbsp;return&nbsp;sigmoid(inX)*(1.0-sigmoid(inX))&nbsp;&nbsp;def&nbsp;tangenth(inX):&nbsp;&nbsp;return&nbsp;(1.0*math.exp(inX)-1.0*math.exp(-inX))/(1.0*math.exp(inX)+1.0*math.exp(-inX))&nbsp;&nbsp;def&nbsp;cnn_conv(in_image,&nbsp;filter_map,B,type_func='sigmoid'):&nbsp;&nbsp;#in_image[num,feature&nbsp;map,row,col]=>in_image[Irow,Icol]&nbsp;&nbsp;#features&nbsp;map[k&nbsp;filter,row,col]&nbsp;&nbsp;#type_func['sigmoid','tangenth']&nbsp;&nbsp;#out_feature[k&nbsp;filter,Irow-row+1,Icol-col+1]&nbsp;&nbsp;shape_image=numpy.shape(in_image)#[row,col]&nbsp;&nbsp;#print&nbsp;"shape_image",shape_image&nbsp;&nbsp;shape_filter=numpy.shape(filter_map)#[k&nbsp;filter,row,col]&nbsp;&nbsp;if&nbsp;shape_filter[1]>shape_image[0]&nbsp;or&nbsp;shape_filter[2]>shape_image[1]:&nbsp;&nbsp;raise&nbsp;Exception&nbsp;&nbsp;shape_out=(shape_filter[0],shape_image[0]-shape_filter[1]+1,shape_image[1]-shape_filter[2]+1)&nbsp;&nbsp;out_feature=numpy.zeros(shape_out)&nbsp;&nbsp;k,m,n=numpy.shape(out_feature)&nbsp;&nbsp;for&nbsp;k_idx&nbsp;in&nbsp;range(0,k):&nbsp;&nbsp;#rotate&nbsp;180&nbsp;to&nbsp;calculate&nbsp;conv&nbsp;&nbsp;c_filter=numpy.rot90(filter_map[k_idx,:,:],&nbsp;2)&nbsp;&nbsp;for&nbsp;r_idx&nbsp;in&nbsp;range(0,m):&nbsp;&nbsp;for&nbsp;c_idx&nbsp;in&nbsp;range(0,n):&nbsp;&nbsp;#conv_temp=numpy.zeros((shape_filter[1],shape_filter[2]))&nbsp;&nbsp;conv_temp=numpy.dot(in_image[r_idx:r_idx+shape_filter[1],c_idx:c_idx+shape_filter[2]],c_filter)&nbsp;&nbsp;sum_temp=numpy.sum(conv_temp)&nbsp;&nbsp;if&nbsp;type_func=='sigmoid':&nbsp;&nbsp;out_feature[k_idx,r_idx,c_idx]=sigmoid(sum_temp+B[k_idx])&nbsp;&nbsp;elif&nbsp;type_func=='tangenth':&nbsp;&nbsp;out_feature[k_idx,r_idx,c_idx]=tangenth(sum_temp+B[k_idx])&nbsp;&nbsp;else:&nbsp;&nbsp;raise&nbsp;Exception&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;out_feature&nbsp;&nbsp;def&nbsp;cnn_maxpooling(out_feature,pooling_size=2,type_pooling="max"):&nbsp;&nbsp;k,row,col=numpy.shape(out_feature)&nbsp;&nbsp;max_index_Matirx=numpy.zeros((k,row,col))&nbsp;&nbsp;out_row=int(numpy.floor(row/pooling_size))&nbsp;&nbsp;out_col=int(numpy.floor(col/pooling_size))&nbsp;&nbsp;out_pooling=numpy.zeros((k,out_row,out_col))&nbsp;&nbsp;for&nbsp;k_idx&nbsp;in&nbsp;range(0,k):&nbsp;&nbsp;for&nbsp;r_idx&nbsp;in&nbsp;range(0,out_row):&nbsp;&nbsp;for&nbsp;c_idx&nbsp;in&nbsp;range(0,out_col):&nbsp;&nbsp;temp_matrix=out_feature[k_idx,pooling_size*r_idx:pooling_size*r_idx+pooling_size,pooling_size*c_idx:pooling_size*c_idx+pooling_size]&nbsp;&nbsp;out_pooling[k_idx,r_idx,c_idx]=numpy.amax(temp_matrix)&nbsp;&nbsp;max_index=numpy.argmax(temp_matrix)&nbsp;&nbsp;#print&nbsp;max_index&nbsp;&nbsp;#print&nbsp;max_index/pooling_size,max_index%pooling_size&nbsp;&nbsp;max_index_Matirx[k_idx,pooling_size*r_idx+max_index/pooling_size,pooling_size*c_idx+max_index%pooling_size]=1&nbsp;&nbsp;return&nbsp;out_pooling,max_index_Matirx&nbsp;&nbsp;def&nbsp;poolwithfunc(in_pooling,W,B,type_func='sigmoid'):&nbsp;&nbsp;k,row,col=numpy.shape(in_pooling)&nbsp;&nbsp;out_pooling=numpy.zeros((k,row,col))&nbsp;&nbsp;for&nbsp;k_idx&nbsp;in&nbsp;range(0,k):&nbsp;&nbsp;for&nbsp;r_idx&nbsp;in&nbsp;range(0,row):&nbsp;&nbsp;for&nbsp;c_idx&nbsp;in&nbsp;range(0,col):&nbsp;&nbsp;out_pooling[k_idx,r_idx,c_idx]=sigmoid(W[k_idx]*in_pooling[k_idx,r_idx,c_idx]+B[k_idx])&nbsp;&nbsp;return&nbsp;out_pooling&nbsp;&nbsp;#out_feature&nbsp;is&nbsp;the&nbsp;out&nbsp;put&nbsp;of&nbsp;conv&nbsp;&nbsp;def&nbsp;backErrorfromPoolToConv(theta,max_index_Matirx,out_feature,pooling_size=2):&nbsp;&nbsp;k1,row,col=numpy.shape(out_feature)&nbsp;&nbsp;error_conv=numpy.zeros((k1,row,col))&nbsp;&nbsp;k2,theta_row,theta_col=numpy.shape(theta)&nbsp;&nbsp;if&nbsp;k1!=k2:&nbsp;&nbsp;raise&nbsp;Exception&nbsp;&nbsp;for&nbsp;idx_k&nbsp;in&nbsp;range(0,k1):&nbsp;&nbsp;for&nbsp;idx_row&nbsp;in&nbsp;range(&nbsp;0,&nbsp;row):&nbsp;&nbsp;for&nbsp;idx_col&nbsp;in&nbsp;range(&nbsp;0,&nbsp;col):&nbsp;&nbsp;error_conv[idx_k,idx_row,idx_col]=\&nbsp;&nbsp;max_index_Matirx[idx_k,idx_row,idx_col]*\&nbsp;&nbsp;float(theta[idx_k,idx_row/pooling_size,idx_col/pooling_size])*\&nbsp;&nbsp;difsigmoid(out_feature[idx_k,idx_row,idx_col])&nbsp;&nbsp;return&nbsp;error_conv&nbsp;&nbsp;def&nbsp;backErrorfromConvToInput(theta,inputImage):&nbsp;&nbsp;k1,row,col=numpy.shape(theta)&nbsp;&nbsp;#print&nbsp;"theta",k1,row,col&nbsp;&nbsp;i_row,i_col=numpy.shape(inputImage)&nbsp;&nbsp;if&nbsp;row>i_row&nbsp;or&nbsp;col>&nbsp;i_col:&nbsp;&nbsp;raise&nbsp;Exception&nbsp;&nbsp;filter_row=i_row-row+1&nbsp;&nbsp;filter_col=i_col-col+1&nbsp;&nbsp;detaW=numpy.zeros((k1,filter_row,filter_col))&nbsp;&nbsp;#the&nbsp;same&nbsp;with&nbsp;conv&nbsp;valid&nbsp;in&nbsp;matlab&nbsp;&nbsp;for&nbsp;k_idx&nbsp;in&nbsp;range(0,k1):&nbsp;&nbsp;for&nbsp;idx_row&nbsp;in&nbsp;range(0,filter_row):&nbsp;&nbsp;for&nbsp;idx_col&nbsp;in&nbsp;range(0,filter_col):&nbsp;&nbsp;subInputMatrix=inputImage[idx_row:idx_row+row,idx_col:idx_col+col]&nbsp;&nbsp;#print&nbsp;"subInputMatrix",numpy.shape(subInputMatrix)&nbsp;&nbsp;#rotate&nbsp;theta&nbsp;180&nbsp;&nbsp;#print&nbsp;numpy.shape(theta)&nbsp;&nbsp;theta_rotate=numpy.rot90(theta[k_idx,:,:],&nbsp;2)&nbsp;&nbsp;#print&nbsp;"theta_rotate",theta_rotate&nbsp;&nbsp;dotMatrix=numpy.dot(subInputMatrix,theta_rotate)&nbsp;&nbsp;detaW[k_idx,idx_row,idx_col]=numpy.sum(dotMatrix)&nbsp;&nbsp;detaB=numpy.zeros((k1,1))&nbsp;&nbsp;for&nbsp;k_idx&nbsp;in&nbsp;range(0,k1):&nbsp;&nbsp;detaB[k_idx]=numpy.sum(theta[k_idx,:,:])&nbsp;&nbsp;return&nbsp;detaW,detaB&nbsp;&nbsp;def&nbsp;loadMNISTimage(absFilePathandName,datanum=60000):&nbsp;&nbsp;images=open(absFilePathandName,'rb')&nbsp;&nbsp;buf=images.read()&nbsp;&nbsp;index=0&nbsp;&nbsp;magic,&nbsp;numImages&nbsp;,&nbsp;numRows&nbsp;,&nbsp;numColumns&nbsp;=&nbsp;struct.unpack_from('>IIII'&nbsp;,&nbsp;buf&nbsp;,&nbsp;index)&nbsp;&nbsp;print&nbsp;magic,&nbsp;numImages&nbsp;,&nbsp;numRows&nbsp;,&nbsp;numColumns&nbsp;&nbsp;index&nbsp;+=&nbsp;struct.calcsize('>IIII')&nbsp;&nbsp;if&nbsp;magic&nbsp;!=&nbsp;2051:&nbsp;&nbsp;raise&nbsp;Exception&nbsp;&nbsp;datasize=int(784*datanum)&nbsp;&nbsp;datablock=">"+str(datasize)+"B"&nbsp;&nbsp;#nextmatrix=struct.unpack_from('>47040000B'&nbsp;,buf,&nbsp;index)&nbsp;&nbsp;nextmatrix=struct.unpack_from(datablock&nbsp;,buf,&nbsp;index)&nbsp;&nbsp;nextmatrix=numpy.array(nextmatrix)/255.0&nbsp;&nbsp;#nextmatrix=nextmatrix.reshape(numImages,numRows,numColumns)&nbsp;&nbsp;#nextmatrix=nextmatrix.reshape(datanum,1,numRows*numColumns)&nbsp;&nbsp;nextmatrix=nextmatrix.reshape(datanum,1,numRows,numColumns)&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;nextmatrix,&nbsp;numImages&nbsp;&nbsp;def&nbsp;loadMNISTlabels(absFilePathandName,datanum=60000):&nbsp;&nbsp;labels=open(absFilePathandName,'rb')&nbsp;&nbsp;buf=labels.read()&nbsp;&nbsp;index=0&nbsp;&nbsp;magic,&nbsp;numLabels&nbsp;&nbsp;=&nbsp;struct.unpack_from('>II'&nbsp;,&nbsp;buf&nbsp;,&nbsp;index)&nbsp;&nbsp;print&nbsp;magic,&nbsp;numLabels&nbsp;&nbsp;index&nbsp;+=&nbsp;struct.calcsize('>II')&nbsp;&nbsp;if&nbsp;magic&nbsp;!=&nbsp;2049:&nbsp;&nbsp;raise&nbsp;Exception&nbsp;&nbsp;datablock=">"+str(datanum)+"B"&nbsp;&nbsp;#nextmatrix=struct.unpack_from('>60000B'&nbsp;,buf,&nbsp;index)&nbsp;&nbsp;nextmatrix=struct.unpack_from(datablock&nbsp;,buf,&nbsp;index)&nbsp;&nbsp;nextmatrix=numpy.array(nextmatrix)&nbsp;&nbsp;return&nbsp;nextmatrix,&nbsp;numLabels&nbsp;&nbsp;def&nbsp;simpleCNN(numofFilter,filter_size,pooling_size=2,maxIter=1000,imageNum=500):&nbsp;&nbsp;decayRate=0.01&nbsp;&nbsp;MNISTimage,num1=loadMNISTimage("F:\Machine&nbsp;Learning\UFLDL\data\common\\train-images-idx3-ubyte",imageNum)&nbsp;&nbsp;print&nbsp;num1&nbsp;&nbsp;row,col=numpy.shape(MNISTimage[0,0,:,:])&nbsp;&nbsp;out_Di=numofFilter*((row-filter_size+1)/pooling_size)*((col-filter_size+1)/pooling_size)&nbsp;&nbsp;MLP=BMNN2.MuiltilayerANN(1,[128],out_Di,10,maxIter)&nbsp;&nbsp;MLP.setTrainDataNum(imageNum)&nbsp;&nbsp;MLP.loadtrainlabel("F:\Machine&nbsp;Learning\UFLDL\data\common\\train-labels-idx1-ubyte")&nbsp;&nbsp;MLP.initialweights()&nbsp;&nbsp;#MLP.printWeightMatrix()&nbsp;&nbsp;rng&nbsp;=&nbsp;numpy.random.RandomState(23455)&nbsp;&nbsp;W_shp&nbsp;=&nbsp;(numofFilter,&nbsp;filter_size,&nbsp;filter_size)&nbsp;&nbsp;W_bound&nbsp;=&nbsp;numpy.sqrt(numofFilter&nbsp;*&nbsp;filter_size&nbsp;*&nbsp;filter_size)&nbsp;&nbsp;W_k=rng.uniform(low=-1.0&nbsp;/&nbsp;W_bound,high=1.0&nbsp;/&nbsp;W_bound,size=W_shp)&nbsp;&nbsp;B_shp&nbsp;=&nbsp;(numofFilter,)&nbsp;&nbsp;B=&nbsp;numpy.asarray(rng.uniform(low=-.5,&nbsp;high=.5,&nbsp;size=B_shp))&nbsp;&nbsp;cIter=0&nbsp;&nbsp;while&nbsp;cIter<maxIter:&nbsp;&nbsp;cIter&nbsp;+=&nbsp;1&nbsp;&nbsp;ImageNum=random.randint(0,imageNum-1)&nbsp;&nbsp;conv_out_map=cnn_conv(MNISTimage[ImageNum,0,:,:],&nbsp;W_k,&nbsp;B,"sigmoid")&nbsp;&nbsp;out_pooling,max_index_Matrix=cnn_maxpooling(conv_out_map,2,"max")&nbsp;&nbsp;pool_shape&nbsp;=&nbsp;numpy.shape(out_pooling)&nbsp;&nbsp;MLP_input=out_pooling.reshape(1,1,out_Di)&nbsp;&nbsp;#print&nbsp;numpy.shape(MLP_input)&nbsp;&nbsp;DetaW,DetaB,temperror=MLP.backwardPropogation(MLP_input,ImageNum)&nbsp;&nbsp;if&nbsp;cIter%50&nbsp;==0&nbsp;:&nbsp;&nbsp;print&nbsp;cIter,"Temp&nbsp;error:&nbsp;",temperror&nbsp;&nbsp;#print&nbsp;numpy.shape(MLP.Theta[MLP.Nl-2])&nbsp;&nbsp;#print&nbsp;numpy.shape(MLP.Ztemp[0])&nbsp;&nbsp;#print&nbsp;numpy.shape(MLP.weightMatrix[0])&nbsp;&nbsp;theta_pool=MLP.Theta[MLP.Nl-2]*MLP.weightMatrix[0].transpose()&nbsp;&nbsp;#print&nbsp;numpy.shape(theta_pool)&nbsp;&nbsp;#print&nbsp;"theta_pool",theta_pool&nbsp;&nbsp;temp=numpy.zeros((1,1,out_Di))&nbsp;&nbsp;temp[0,:,:]=theta_pool&nbsp;&nbsp;back_theta_pool=temp.reshape(pool_shape)&nbsp;&nbsp;#print&nbsp;"back_theta_pool",numpy.shape(back_theta_pool)&nbsp;&nbsp;#print&nbsp;"back_theta_pool",back_theta_pool&nbsp;&nbsp;error_conv=backErrorfromPoolToConv(back_theta_pool,max_index_Matrix,conv_out_map,2)&nbsp;&nbsp;#print&nbsp;"error_conv",numpy.shape(error_conv)&nbsp;&nbsp;#print&nbsp;error_conv&nbsp;&nbsp;conv_DetaW,conv_DetaB=backErrorfromConvToInput(error_conv,MNISTimage[ImageNum,0,:,:])&nbsp;&nbsp;#print&nbsp;"W_k",W_k&nbsp;&nbsp;#print&nbsp;"conv_DetaW",conv_DetaW&nbsp;&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP