小乔家人 2020-03-17 02:57 采纳率: 0%
浏览 1113

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

下载的代码和数据集,只修改了路径,但是出现明明有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);  %训练数据,神经元设计,训练参数

>> 
  • 写回答

2条回答 默认 最新

  • NiGuan_FeiXian 2020-06-04 17:04
    关注

    有可能是matlab版本的问题,我之前用matlab2018a跑过这个类似的程序,但是也出现了类似的问题,还提到了GPU什么的。后来在网上查了一下,trainNetwork()这个函数好像是在matlab2019a上才出现的。然后我在2020a的版本上跑了一下,符合预期,识别比较准确。

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器