大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
本文主要是根据《matlab手写神经网络实现识别手写数字》博客中的代码进行试验。由于没有数据集,所以采用了MNIST数据集进行代码的运行。数据集不同所以需要对代码进行微小改动。
简介
数据处理:4000张作为训练样本,1000张作为测试样本;
图像大小:图片的灰度值矩阵(28,28);
图像名称:由标签和顺序号组成。标签_顺序号.bmp
训练样本:每个数字的图像名称的顺序号是从0-399,各400个。
测试样本:每个数字的图像名称的顺序号是从401-500,各100个。
标签制作
标签格式:
训练数据集中前400个标签都是[1,0,0,0,0,0,0,0,0,0]代表数字0,401-800个标签都是[0,1,0,0,0,0,0,0,0,0]代表数字2,其余类推。这也就是所谓的onehot
由于数据集不同,图像的格式也不一样等因素,需要对代码稍微做修改,具体如下:
制作label时遇到的障碍,xlswrite()函数在写入矩阵时对矩阵大小有限制,一定要小心,因为我的电脑安装的是2003,所以无法对4000列数据直接写入,只好行列互换后再存储,代码将生成两个xsl文件,分别是label.xsl和label2.xsl,分别是训练数据和测试数据的标签。
增加一个label_create.m文件,用来新建标签文件。
label_create.m代码:
% 创建Excel存储label
% 根据图片的名字,例如:3_101.bmp,第一个数值是标签,第二个是图片数。
% 为了转换成神经网络的标签,0-9这10个标签应转换为[1,0,0,0,0,0,0,0,0,0],[0,1,0,0,0,0,0,0,0,0]
% 这样的格式,即第几位是1就代表标签是几?如[0,1,0,0,0,0,0,0,0,0]代表2
% 例如我们的前 400个图都是0,所以标签都是[1,0,0,0,0,0,0,0,0,0]
% 因为每个版本的Excel允许存储的行列不同,这里是2003版存储不下4000列,故需要将label矩阵转置后才能存下
% Excel2003可存储:65536*256
clear all;
clc;
label=zeros(10,4000);
label2=zeros(10,1000);
eye_sam=eye(10);
for j=1:10
label(:,(400*(j-1)+1):400*j)= repmat( eye_sam(:,j),1,400 );
end
T=label';
xlswrite('D:\Documents\MATLAB\label.xls',T);
for j=1:10
label2(:,(100*(j-1)+1):100*j)= repmat( eye_sam(:,j),1,100 );
end
T2=label2';
xlswrite('D:\Documents\MATLAB\label2.xls',T2);
getdata.m代码修改:
function[x_train,y_train,x_test,y_test]=getdata()
% 把图片变成像素矩阵
% path :图片路径
% x_train:训练样本像素矩阵(784,4000)
% y_train:训练样本标签(10,4000)
% x_test:测试样本像素矩阵(784,1000)
% y_test:测试样本标签(10,1000)
x_train = [];
for i=0:9
for j=0:399
x=im2double(imread(strcat('D:\Documents\MATLAB\images4000\',num2str(i),'_', num2str(j),'.bmp')));
x=reshape(x,784,1); % 将28*28的数值矩阵变为784*1,每列代表一幅图
x_train = [x_train,x]; % 每循环一次加入一列数据
end
end
x_test =[];
for i=0:9
for j=401:500
x=im2double(imread(strcat('D:\Documents\MATLAB\images_test1000\',num2str(i),'_', num2str(j),'.bmp')));
x=reshape(x,784,1); % 将28*28的数值矩阵变为784*1,每列代表一幅图
x_test = [x_test,x]; % 每循环一次加入一列数据
end
end
% 读取标签文件,注意:由于标签的存储问题,读入后需要进行转置
data=xlsread('label.xls');
data2=xlsread('label2.xls');
y_train=data';
y_test = data2';
% 返回的参数
x_train;
y_train;
x_test;
y_test;
end
其余代码保持和原博客中的一致。全部文件如下图:
运行main.m文件即可。
文件下载地址:链接:https://pan.baidu.com/s/1JhPs94qO-7VkPI_kknv_Tg
提取码:xuu6
如链接失效可加QQ:1021288218 索取。
参考:
https://blog.csdn.net/yunyunyx/article/details/80473532
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193856.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...