matlab卷积神经网络的创建与图片识别

1、Deep Network Designer工具箱使用介绍

2、神经网络的GPU训练

3、预测与分类

一、Deep Network Designer工具箱使用介绍

相比BP、GRNN、RBF、NARX神经网络的简单结构,深度神经网络结构更加复杂,比如卷积神经网络CNN,长短时序神经网络LSTM等,matlab集成了深度学习工具箱,可输入如下指令调用:

Deep Network Designer

matlab卷积神经网络的创建与图片识别_第1张图片

可以使用别人的网络架构也可以自己创建,点击“空白网络”创建。如下图最左侧是常用的各种网络层,可根据文献上的网络结构或者自己设计的结构任意组合,具体模块参数双击进行设计,前提是网络数据维度没有错误。如图所示,为作者创建的用于RGB图像分类的卷积神经网络CNN结构,具体设计过程后续出。构建完成,点击“分析”可查看是否有错误,无错误之后可通过“导出”得到网络架构的代码即layers。

matlab卷积神经网络的创建与图片识别_第2张图片

layers = [
    imageInputLayer([120 160 3],"Name","imageinput")   %输入相机帧
    convolution2dLayer([3 3],15,"Name","conv_1","Padding","same")   %卷积层
    reluLayer("Name","relu_1")
    averagePooling2dLayer([2 2],"Name","avgpool2d_1","Stride",[2 2])  %平均池化层
    convolution2dLayer([3 3],15,"Name","conv_2","Padding","same")  %卷积层
    reluLayer("Name","relu_2")
    averagePooling2dLayer([2 2],"Name","avgpool2d_2","Stride",[2 2])  %平均池化层
    convolution2dLayer([3 3],12,"Name","conv_3","Padding","same")   %卷积层
    reluLayer("Name","relu_3")
    averagePooling2dLayer([2 2],"Name","avgpool2d_3","Stride",[2 2])  %平均池化层
    dropoutLayer(0.3,"Name","dropout_2")  %随机失活,失活率为30%
    fullyConnectedLayer(256,"Name","fc_1","WeightL2Factor",6)  %全连接层
    reluLayer("Name","relu_4")
    dropoutLayer(0.3,"Name","dropout_1")  %随机失活,失活率为30%
    fullyConnectedLayer(20,"Name","fc_2","WeightL2Factor",6)  %全连接层
    softmaxLayer("Name","softmax") 
    classificationLayer("Name","classoutput")];   %输出层

创建一个m程序,将此代码复制进去。

二、神经网络的GPU训练

网络构建好以后,就是编写训练的代码,主要过程分为:读取数据集、归一化(可有可无)、划分训练集与测试集、反归一化(可有可无)、训练配置与训练。作者此处给出图像分类的代码,详细过程可见代码注释。

%% 工具箱导出的网络结构
layers = [
    imageInputLayer([120 160 3],"Name","imageinput")
    convolution2dLayer([3 3],15,"Name","conv_1","Padding","same")
    reluLayer("Name","relu_1")
    averagePooling2dLayer([2 2],"Name","avgpool2d_1","Stride",[2 2])
    convolution2dLayer([3 3],15,"Name","conv_2","Padding","same")
    reluLayer("Name","relu_2")
    averagePooling2dLayer([2 2],"Name","avgpool2d_2","Stride",[2 2])
    convolution2dLayer([3 3],12,"Name","conv_3","Padding","same")
    reluLayer("Name","relu_3")
    averagePooling2dLayer([2 2],"Name","avgpool2d_3","Stride",[2 2])
    dropoutLayer(0.3,"Name","dropout_2")
    fullyConnectedLayer(256,"Name","fc_1","WeightL2Factor",6)
    reluLayer("Name","relu_4")
    dropoutLayer(0.3,"Name","dropout_1")
    fullyConnectedLayer(20,"Name","fc_2","WeightL2Factor",6)
    softmaxLayer("Name","softmax")
    classificationLayer("Name","classoutput")];
%% 读取数据集
digitDatasetPath=fullfile('.\');  %打开数据集文件夹路径
% 注释:此路径下放有30个文件夹,每个文件夹为一个类别,每个文件夹里面有等数量的图片,这些图片都已经预处理。
imds=imageDatastore(digitDatasetPath,...
    'IncludeSubfolders',true,'LabelSource','foldernames');  %读取图片数据集,标签Label设置为文件名。
% 注释:每个文件夹的名字即为分类的类别标签
%% 划分数据集(训练集和验证集)
numTrainFiles=round(2/3*30);   % 20为类别文件夹数量,测试集作者放在另外的地方,训练时候只需要训练集和验证集。
[imdsTrain,imdsValidation]=splitEachLabel(imds,numTrainFiles,'randomize'); % 随机划分每类文件夹下的训练集和验证集

%若数据图片大小与网络输入不一样,可通过下面三行代码处理。若相同可去掉此三行代码
inputSize=layers(1).InputSize;  %读取网络输入层的输入图像的大小尺寸
imdsTrain=augmentedImageDatastore(inputSize(1:2),imdsTrain);  %整合训练集的尺寸1与inputSize的第一二个维度相同。
augimdsValidation=augmentedImageDatastore(inputSize(1:2),imdsValidation);
%%  训练配置
ExecutionEnvironment='gpu';  %此处设置用GPU或者CPU训练,建议GPU快
%具体一些需要改动的配置说明,可以上matlab官网查看trainingOptions函数文档
options_train=trainingOptions('sgdm',...
    'MaxEpochs',100,...   % 训练轮数为65次
    'InitialLearnRate',0.0001,...  %初始学习率
    'Verbose',true,'MiniBatchSize',10,... 
    'LearnRateSchedule','piecewise',...
    'LearnRateDropFactor',0.6,...
    'LearnRateDropPeriod',5,...
    'Plots','training-progress',...
    'ValidationData',augimdsValidation,...
    'ValidationFrequency',10,...
    'ExecutionEnvironment',ExecutionEnvironment);  
net=trainNetwork(imdsTrain,layers,options_train);   %开始训练
save('train.mat'); %保存训练完的网络模型为train.mat。

三、预测与分类

此处我们是属于分类任务,所以在第一步创建网络最后一层模块是分类块,如果是数据回归即数据预测则不同,本文不详细说明。下面给出利用已训练好的网络模型进行分类的代码。再创建一个m程序用来放分类的代码:

load('train.mat'); %先下载同一文件夹下之前训练好的模型
x=imread('1.jpg'); %读取一张事先准备好的图片1,命名为x
YPred=classify(net,x); %用训练好的网络net对x进行分类识别 ,分类结果为YPred
sprintf('测试结果为%s',YPred) 将结果YPred显示。注意这个YPred是一个奇怪的数据类型categorical
%为了后续GUI界面的方便使用,作者的数据集名字即类别lable都是数字哦
%下面就是将categorical数据类型转化为矩阵mat类型,命名为nn。
M=string(YPred);
nn=double(M);

结语

读者可能需要一些图片的预处理和数据增强,视频帧读取,GUI的网络嵌入与端到端识别等程序,可以参考其他博主的文章,作者后续闲暇之余有可能会出相关博客。本文神经网络和识别的一些原理算法,后续博客直接给出本科毕设论文以供参考。

你可能感兴趣的:(matlab,dnn,深度学习)