基于MATLAB的CNN网络---数据生成与网络搭建

数据集制作

目的:将两个文件夹下的图片数据放入mat文件中,包含label和image两个模块。
基于MATLAB的CNN网络---数据生成与网络搭建_第1张图片

1.取出数据
这里我们取出两次数据,包括数据集中Bad和Good两个类别的图像。
这里我将图像大小缩减为280*280,图像越大,处理的时间越长,如果电脑内存不够就会卡死的。

pt = 'E:\数据集\03-DRIMDB\Bad\'; %读取路径   
ext = '*.jpg';   
dis = dir([pt ext]);   
nms = {dis.name};   
      
for k = 1:length(nms)   
    nm = [pt nms{k}]; %nm存储每张图片的路径(包括图片名)D:\Workspace\Matlab\1.bmp   
    image = rgb2gray(imread(nm));  
    image = imresize(image,[280,280]);
    image(:,:,k)=image; %将第k张图片存储到三维数组的第k页   
end   
% labels = ones(k,1);
% save fundus_img labels images; %将数组存储为mat格式  
%%
pt1 = 'E:\数据集\03-DRIMDB\Good\'; %读取路径   
ext1 = '*.jpg';   
dis1 = dir([pt1 ext1]);   
nms1 = {dis1.name}; 
   
for k1 = 1:length(nms)   
    nm1 = [pt1 nms1{k1}]; %nm存储每张图片的路径(包括图片名)D:\Workspace\Matlab\1.bmp   
    image1 = rgb2gray(imread(nm1)); 
    image1 = imresize(image1,[280,280]);
    image1(:,:,k1)=image1; %将第k张图片存储到三维数组的第k页   
end   

2.存入数据
将取出的image和label存入到mat文件中,作为后续CNN的输入。

images = cat(3,image,image1);
labels = [ones(k,1);zeros(k1,1)];
save fundus_img labels images; %将数组存储为mat格式  

神经网络搭建

3.划分数据集
相关的图像大小要更改。
训练集、测试集和验证集的比例可以更改。

load('fundus_img.mat')

X = reshape(images, [280,280,1,length(labels)]); % 灰度图片的作为输入的要求为h*w**c*s,
                                               % 其中h为图片的长度,w为宽度,c为通道数,s就是数据的个数
size(X)                                        % 可以看到我们的数据集尺寸为:28*28*1*18724
Y = categorical(labels);                       % 标签的数据类型为categorical

idx = randperm(length(labels));   % 产生一个和数据个数一致的随机数序列,范围是0~length(images)
num_train = round(0.5*length(labels)); % 训练集个数,0.5表示全部数据中随机选取50%作为训练集
num_val = round(0.3*length(labels));   % 验证集个数,0.3表示全部数据中随机选取30%作为验证集,故测试集自动变为剩下的20%

% 训练集,验证集和测试集数据
X_train = X(:,:,:,idx(1:num_train));
X_val = X(:,:,:,idx(num_train+1:num_train+num_val));
X_test = X(:,:,:,idx(num_train+num_val+1:end));  %这里假设,全部数据中除了

% 训练集,验证集和测试集标签
Y_train = Y(idx(1:num_train),:);
Y_val = Y(idx(num_train+1:num_train+num_val),:);
Y_test = Y(idx(num_train+num_val+1:end),:);

4.搭建模型
更改输入层的图像大小;
更改全连接层输出类别(与标签类别相匹配)。

% 定义网络层
layers = [...
          imageInputLayer([280,280,1]); % 输入层,要正确输入图片的height, width 和 number of channels of the images
          batchNormalizationLayer();  % 批量归一化
          convolution2dLayer(5,20);   % 卷积层
          batchNormalizationLayer();
          reluLayer()                 % Relu激活函数 
          maxPooling2dLayer(2,'Stride',2); % 池化层
          fullyConnectedLayer(2);       % 全连接层
          softmaxLayer();                % softmax层
          classificationLayer(),...
    ];

% 参数
options = trainingOptions('sgdm',...   % 也可以用adam、rmsprop等方法
    'MaxEpochs',1000,...                 % 最大迭代次数
    'Plots','training-progress');
net_cnn = trainNetwork(X_train,Y_train,layers,options);

5.结果分析
根据已搭建的网络做图像质量分类的准确度并不高,原因有以下几点:
数据集数量少;
图像大小缩放使图像模糊;
模型太简单;
一一一一一一一一一一一一一一一一一一一一一一一一一一
继续尝试更复杂的网络模型。

你可能感兴趣的:(matlab深度学习,神经网络,深度学习)