1输出连续值的深度神经网络1.前言本文设计并实现了输出连续值的深度神经网络。可用于自动构图特征线位置判断等需要连续值的场合。特征线的位置可以是垂直的,也可以是水平的。即特征线有垂直和水平两种特征线。所设计的深度神经网络基于DeeplearningToolbox中的神经神经网络修改而来。主要修改内容为将输出节点数由原来的10个调整为3个。每个节点的输出值也进行重新定义。原节点输出值表示属于某个分类的概率值。而新的节点输出值表示特征线所位于的图像中位置在整幅图像中的比例值。深度神经网络共5层,包含两层卷积层。每层卷积层后会加一层sigmoid函数层作为卷积层的激活函数。本文所涉及的代码已经在UFLDL教程的相关它模块中被调试通过并保存。并且与CNN_matlab_code一文中的代码相对应。2.经验总结深度神经网络就像是一个具备很强学习能力的学生,对深度神经网络进行训练的样本就像是教学生用的教材。选用什么教材,能教会学生什么样的技能。在教学生的过程中,还要注意方式方法。对于同样的教材和同样的学生,如果采用不同的教学方式方法,可能获得完全不同的教学结果。对于自动构图而言,如果需要使得同一个深度神经网络能识别水平和垂直两种特征线位置,首先要收集足够的具备两种特征线的图片样本。其次就是设计3个输出节点的输出值的含义。有两种方案,能取得截然不同的训练效果。第一种方案:令节点1表示水平特征线位置在整幅图像中的比例,令节点2表示垂直特征线位置在整幅图像中的比例,那么训练效果会很差;节点1和节点2的输出值无法准确反映水平或垂直特征线位置在整幅图像中的比例。第二种方案:令节点1区分水平特征线还是垂直特征线;如果节点1输出值为1,那么表示是水平特征线;如果节点1输出值为0,那么表示是垂直特征线。而节点2所输出的值表示特征线的位置在整幅图像中的比例;当节点1输出的值为1时,节点2输出值表示水平特征线的位置在整幅图像中的比例;当节点1输出的值为0时,节点2输出值表示垂直特征线的位置在整幅图像中的比例;这种训练效果良好;节点1输出的值能准确反映图像中包含水平特征线还是垂直特征线;节点2输出的值能准确反映图像中包含水平特征线或垂直特征线的位置在图像中所处的比例。对于深度神经网络,如果出现过拟合现象,那么可减少深度神经网络的层数,从而减少网络中可调整的参数,使得神经网络能正确处理训练样本之外的样本。如果出现欠拟合现象,那么可增加深度神经网络的层数,从而增加网络中可调整的参数,使得神经网络能准确拟合所有的训练样本。当深度网络的层数较少时,sigmoid函数能很好地使得网络收敛。当深度网络的层数较多时,sigmoid函数无法使得网络很好地收敛。此时需要采用Relu等改进的激活函数以及层之间的归一化处理等方式,使得深度神经网络尽快收敛。23.代码更新部分3.1测试代码%1.2017.04.11:perfecttestresults:thecontinuousoutputresultsincidedwiththeir%exptectedvalues.%2.2017.04.12:testmysamples%3.horitizatalorverticalcharacteriticidentification;%4.reducethecnnparameterstosolvetheproblemofoverfitting%5.reducetheprecisionofparametertosingleprecisionclearallclccloseallfork=1:8temp=imread(['img_sample_h',num2str(k),'.jpg']);img1=repmat(temp,1,1,2);train_x(:,:,k)=img1(:,:,1);train_y(1:3,k)=single(k)/10;endfork=1:8temp=imread(['sample_folder\sample3_',num2str(k),'.jpg']);img1=repmat(temp,1,1,2);train_x(:,:,k+8)=img1(:,:,1);%train_y(1:3,k)=double(k)/10;train_y(1:3,k+8)=single(k)/10;endfork=1:8temp=imread(['sample_folder\sample_',num2str(k),'.jpg']);img1=repmat(temp,1,1,2);train_x(:,:,k+16)=img1(:,:,1);%train_y(1:3,k)=double(k)/10;train_y(1:3,k+16)=single(k)/10;endfork=1:8temp=imread(['sample_folder\sample4_',num2str(k),'.jpg']);img1=repmat(temp,1,1,2);train_x(:,:,k+24)=img1(:,:,1);%train_y(1:3,k)=double(k)/10;train_y(1:3,k+24)=single(k)/10;end3train_x1=single(reshape(train_x,96,96,32))/255;train_y1=single(train_y);figurefori=1:32subplot(4,8,i)imshow(train_x1(:,:,i))title(sprintf('h=%.2f',train_y1(1,i)))end%v_cnn=cnnloadcnn_epoch_500.mat%num_train_samples=30000;opts.alpha=1;opts.batchsize=4;%opts.numepochs=1;opts.numepochs=1000;%cnn=cnntrain(cnn,train_x1,train_y1,opts);cnn=cnntrain(cnn,train_x1,train_y1,opts);save('cnn_epoch_500.mat','cnn')%test_x(:,:,1)=imread('img_sample_h3.jpg');%test_x(:,:,2)=imread('img_sample_h34.jpg');%test_x(:,:,3)=imread('img_sample_h37.jpg');%test_x(:,:,4)=imread('img_sample_h4.jpg');test_x(:,:,1)=imread('sample_folder\sample3_4.jpg');test_x(:,:,2)=imread('sample_folder\sample3_8.jpg');test_x(:,:,3)=imread('sample_folder\sample_6.jpg');test_x(:,:,4)=imread('sample_folder\sample_3.jpg');test_y(1:3,1)=0.3;test_y(1:3,2)=0.34;test_y(1:3,3)=0.37;test_y(1:3,4)=0.4;%test_x1=double(reshape(test_x,28,28,4))/255;%test_y1=double(test_y);test_x1=single(reshape(test_x,96,96,4))/255;test_y1=single(test_y);[er,bad]=cnntest(cnn,test_x1,test_y1);43.2训练部分%1.2017.04.11:perfecttestresults:thecontinuousoutputresultsincidedwiththeirexpectedvalues.%2.2017.04.12:testmysamples%3.horitizatalorverticalcharacteriticidentification;%4.reducethecnnparameterstosolvetheproblemofoverfitting%5.reducetheprecisionofparametertosingleprecisionclearallclccloseallfork=1:8temp=imread(['img_sample_h',num2str(k),'.jpg']);img1=repmat(temp,1,1,2);train_x(:,:,k)=img1(:,:,1);%train_y(1:3,k)=double(k)/10;train_y(1:3,k)=single(k)/10;endfork=1:8temp=imread(['sample_folder\sample3_',num2str(k),'.jpg']);img1=repmat(temp,1,1,2);train_x(:,:,k+8)=img1(:,:,1);%train_y(1:3,k)=double(k)/10;train_y(1:3,k+8)=single(k)/10;endfork=1:8temp=imread(['sample_folder\sample_',num2str(k),'.jpg']);img1=repmat(temp,1,1,2);train_x(:,:,k+16)=img1(:,:,1);%train_y(1:3,k)=double(k)/10;train_y(1:3,k+16)=single(k)/10;endfork=1:8temp=imread(['sample_folder\sample4_',num2str(k),'.jpg']);img1=repmat(temp,1,1,2);train_x(:,:,k+24)=img1(:,:,1);%train_y(1:3,k)=double(k)/10;train_y(1:3,k+24)=single(k)/10;end5train_x1=single(reshape(train_x,96,96,32))/255;train_y1=single(train_y);figurefori=1:32subplot(4,8,i)imshow(train_x1(:,:,i))title(sprintf('h=%.2f',train_y1(1,i)))endrand('state',0)%cnn.layers={%struct('type','i')%inputlayer%struct('type','c','outputmaps',6,'kernelsize',5)%convolutionlayer%struct('type','s','scale',2)%subsamplinglayer%struct('type','c','outputmaps',12,'kernelsize',5)%convolutionlayer%struct('type','s','scale',2)%subsamplinglayer%};cnn.layers={struct('type','i')%inputlayerstruct('type','c','outputmaps',6,'kernelsize',5)%convolutionlayerstruct('type','s','scale',2)%subsamplinglayerstruct('type','c','outputmaps',12,'kernelsize',5)%convolutionlayerstruct('type','s','scale',2)%subsamplinglayerstruct('type','c','outputmaps',7,'kernelsize',4)%convolutionlayerstruct('type