matlab手写字的识别代码出现错误,不知道哪里错了?

小乔家人 2020-03-19 07:44:01
下载的代码和数据集,只修改了路径,但是出现明明有22的样本,每个文件夹里面10张图,

但是

当numTrainFiles = 17 ;% 每一个数字有22个样本,取17个样本作为训练数据时
错误使用 matlab.io.datastore.ImageDatastore/splitEachLabel (line 211)
比例值之和(17)不能超过具有最少文件数(10)的标签中的文件数。
请使用 COUNTEACHLABEL 和 MIN 查看与标签关联的最小文件数。

出错 newff0312 (line 15)

[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize')

修改numTrainFiles = 9时,
错误使用 trainNetwork (line 170)
无效的训练数据。最后一层的输出大小(10)与类的数量(22)不匹配。
出错 newff0312 (line 55)
net = trainNetwork(imdsTrain, layers ,options); %训练数据,神经元设计,训练参数

修改digitDatasetPath = fullfile('D:\201910\CT\', '/train1/');
这个路径读取的是dcm图,但是出现错误

错误使用 imageDatastore (line 125)
输入文件夹或文件包含非标准的文件扩展名。

使用 FileExtensions 名称-值对组以包含非标准的文件扩展名。

出错 newff0315 (line 7)
imds = imageDatastore(digitDatasetPath, ...

下载的代码
%% 导入数据
digitDatasetPath = fullfile('D:\201910\CT\', '/hwDataset/');
imds = imageDatastore(digitDatasetPath, ...
'IncludeSubfolders',true,'LabelSource','foldernames');% 采用文件夹名称作为数据标记
%,'ReadFcn',@mineRF

% 数据集图片个数
countEachLabel(imds)

numTrainFiles = 9 ;% 每一个数字有22个样本,取17个样本作为训练数据
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');
% 查看图片的大小
img=readimage(imds,1);
size(img)

%% 定义卷积神经网络的结构
layers = [
% 输入层
imageInputLayer([28 28 1]) %输入图片大小为28*28,灰度图片通道为1
% 卷积层 (特征映射大小计算方式32-5+1=28)
convolution2dLayer(5,6,'Padding',2) %卷积核5*5,提取6种特征映射,
batchNormalizationLayer %padding图片周围补零以保持还是这次卷积之后特征映射28*28,28-5+4+1
reluLayer

maxPooling2dLayer(2,'stride',2) %下采样核2*2

convolution2dLayer(5, 16)
batchNormalizationLayer
reluLayer

maxPooling2dLayer(2,'stride',2)

convolution2dLayer(5, 120)
batchNormalizationLayer
reluLayer
% 最终层
fullyConnectedLayer(10)
softmaxLayer
classificationLayer];

%% 训练神经网络
% 设置训练参数
options = trainingOptions('sgdm',... %最优化方法
'maxEpochs', 50, ... %重复次数
'ValidationData', imdsValidation, ...%验证的数据
'ValidationFrequency',5,... %验证频率
'Verbose',false,... %是否显示中间结果
'Plots','training-progress');% 显示训练进度

% 训练神经网络,保存网络
net = trainNetwork(imdsTrain, layers ,options); %训练数据,神经元设计,训练参数
save 'CSNet.mat' net

%% 标记数据(文件名称方式,自行构造)
mineSet = imageDatastore('D:\201910\CT\hwDataset\hw9\', 'FileExtensions', '.jpg',...
'IncludeSubfolders', false);%%,'ReadFcn',@mineRF
mLabels=cell(size(mineSet.Files,1),1);
for i =1:size(mineSet.Files,1)
[filepath,name,ext] = fileparts(char(mineSet.Files{i}));
mLabels{i,1} =char(name);
end
mLabels2=categorical(mLabels);
mineSet.Labels = mLabels2;


%% 使用网络进行分类并计算准确性
% 手写数据
YPred = classify(net,mineSet);
YValidation =mineSet.Labels;
% 计算正确率
accuracy = sum(YPred ==YValidation)/numel(YValidation);
% 绘制预测结果
figure;
nSample=10;
ind = randperm(size(YPred,1),nSample);
for i = 1:nSample

subplot(2,fix((nSample+1)/2),i)
imshow(char(mineSet.Files(ind(i))))
title(['预测:' char(YPred(ind(i)))])
if char(YPred(ind(i))) ==char(YValidation(ind(i)))
xlabel(['真实:' char(YValidation(ind(i)))])
else
xlabel(['真实:' char(YValidation(ind(i)))],'color','r')
end

end

% 伸缩+反色
% function data =mineRF(filename)
% img= imread(filename);
% data=uint8(255-rgb2gray(imresize(img,[28 28])));
%
% end

% 二值化
% function data =mineRF(filename)
% img= imread(filename);
% data=imbinarize(img);
%
% end

得到的错误结果
ans =

22×2 table

Label Count
_____ _____

hw1 10
hw10 10
hw11 10
hw12 10
hw13 10
hw14 10
hw15 10
hw16 10
hw17 10
hw18 10
hw19 10
hw2 10
hw20 10
hw21 10
hw23 10
hw3 10
hw4 10
hw5 10
hw6 10
hw7 10
hw8 10
hw9 10


ans =

28 28

错误使用 trainNetwork (line 170)
无效的训练数据。最后一层的输出大小(10)与类的数量(22)不匹配。

出错 newff0312 (line 55)
net = trainNetwork(imdsTrain, layers ,options); %训练数据,神经元设计,训练参数

>>
...全文
1537 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rander@ 2021-06-23
  • 打赏
  • 举报
回复

你好,我调试出来了,但是改了数据集的大小,具体有点复杂,要是还需要的话,留言啊

 

hmsjk 2021-09-24
  • 举报
回复
@Rander@ 您好 麻烦您告诉我这个问题到底是什么原因呀
  • 举报
回复
@Rander@ 请问一下怎么解决的

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧