基于MATLAB2019a。---和同学一起完成老师给的作业。
在MATLAB中这两种框架的神经网络是已经经过训练的网络,官方的数据是使用了百万张训练了大约100多个类别的物品,也就是大概可以识别一千多种物品。在深度学习中训练神经网络是一个对硬件要求极高的项目,内部涉及大量的矩阵运算,用CPU训练绝对是一件令人头秃的工作,推荐使用GPU训练(虽然我是没那个条件。。。)。一开始是使用的AlexNet后来专用VGG16,两者的差别在使用时主要体现在图像输入环节。(仅限使用)
对比两种神经网络:
AlexNet: 网络深度为8层,网络的图像输入大小为227×227。
VGG-16: 网络深度为16层,网络的图像输入大小为224×224。
目前对于训练和使用这两个神经网络有用的信息
左AlexNet;右VGG16。
1、将图片做处理,使符合特定网络图像输入大小的要求。(数组放缩就可以)
%从文件夹中选取图片并做处理
[filename,pathname]=uigetfile({'*.jpg';'*.*'},'请选择一张用于识别的照片');
filepath=[pathname,filename];
axes(h_axes1);
data = imread(filepath);
data = imresize(data,[224,224]);
%获取神经网络输入图像数据格式
data1 = data(1:224,1:224,1:3); %vgg16是 [224,224,3]
%最终交由VGG16识别的使data1数组
2、丢到神经网络中,用固定函数筛选出符合图像的标签
net = network; %network为VGG16类型的神经网络训练后返回来的句柄
label = classify(net,data1); %classify函数直接导出标签
image(data1);
title(char(label));
function predict_transfer_alexnet()
global network %待训练vgg16网络的句柄
net = vgg16;% 深度学习vgg16经典网络结构,没有的可以去matlab center下载
trainsferLayer = net.Layers(1:end-3);
imds = imageDatastore('E:\University\Desktop\Matlab\GUI code(1)\practice_Pictures',...%训练图片数据库地址
'includeSubfolders',true,...
'labelsource','foldernames','ReadFcn',@IMAGERESIZE);
T = countEachLabel(imds);
disp(T);
[imdsTrain,imdsTest] = splitEachLabel(imds,0.8);%0.8为训练数据,0.2为测试数据(测试精度会被输出)
%% train
layers = [trainsferLayer;
fullyConnectedLayer(10,'WeightLearnRateFactor',50,'BiasLearnRateFactor',50);%注意第一个参数为类别的数量,我这里是10
softmaxLayer();
classificationLayer()];
options = trainingOptions('sgdm',...
'Maxepochs',10,... %最大训练次数
'InitialLearnRate',0.00035); %初始学习比率(这个需要调试)
network = trainNetwork(imdsTrain,layers,options);
%% predict
predictLabels = classify(network,imdsTest);
testLabels = imdsTest.Labels;
accuracy = sum(predictLabels == testLabels)/numel(predictLabels);
disp(['accuracy:',num2str(accuracy)]); % 输出预测精度结果
function output = IMAGERESIZE(input)
input = imread(input);
if numel(size(input)) == 2
input = cat(3,input,input,input);% 转成3通道的(vgg16要求使三通道)
end
output = imresize(input,[224,224]);
end
end
工程链接:链接:https://pan.baidu.com/s/16EAw26jD1_1XlR4roApq4A 提取码:ilh2