[储备池计算MATLAB] 手写数字识别(MNIST)
💼作者简介:985研究生一枚(非中介,非中介,非中介!!!),使用MATLAB、Python编程,热爱编程与科研,代码获取、论文复现及科研仿真合作可私信(这段是复制的,中介勿扰)
📝微信公众号:暂无(还没开: )
简介
针对文章Reservoir computing using dynamic memristors for temporal information processing的手写数字识别部分进行复现
Du C, Cai F, Zidan M A, et al. Reservoir computing using dynamic memristors for temporal information processing[J]. Nature communications, 2017, 8(1): 2204.
该文章17年发表在nature communication为硬件储备池计算较早期的文章,适合练手
仿真流程
-
建立忆阻器响应模型
-
将训练集按照论文处理方式输入忆阻器,得到忆阻器的响应
-
建立单层网络,对训练集忆阻器的响应进行训练
-
将验证集按相同方式输入忆阻器,得到忆阻器响应
-
使用训练好的单层网络对验证集忆阻器响应进行推理,得到验证集的准确率
响应模型
参考论文补充材料:
可以得到忆阻器对脉冲的响应模型
单层网络的部分不再赘述(可参考【吴恩达机器学习 - 3】利用fmincg函数与正则化实现多元分类问题及神经网络初体验(课后练习第三题ex3)-CSDN博客),可以参考吴恩达的机器学习教程,使用fmincg函数对单层网络进行优化
部分代码展示
%载入数据集
load('test_readout_current_500Hz.mat');
load('train_readout_current_500Hz.mat');
load('test_readout_current_20Hz.mat');
load('train_readout_current_20Hz.mat');
load('test_readout_current.mat');
load('train_current.mat');
train_labels1 = readMNISTLabels('train-labels-idx1-ubyte');%标签0~9;60000个标签,大小为60000*1
test_labels1 = readMNISTLabels('t10k-labels-idx1-ubyte'); %10000个标签,大小为10000*1
%
%单张图像转化为行向量
train_data_x = ones(60000,28*4*3);
for i = 1:60000
tmp1 = train_readout_current_500Hz(:,:,i);
tmp2 = train_readout_current(:,:,i);
tmp3 = train_readout_current_20Hz(:,:,i);
tmp1 = reshape(tmp1,[1,112]);
tmp2 = reshape(tmp2,[1,112]);
tmp3 = reshape(tmp3,[1,112]);
train_data_x(i,:) = [tmp1,tmp2,tmp3];
end
train_lable_y = train_labels1(1:60000)';
%对特征进行标准化 一个忆阻器的readout_current作为一个特征
mu = mean(train_data_x);
sigma = std(train_data_x);
train_data_x = (train_data_x-mu)./sigma;
上述为数据集载入及预处理部分,详细代码及注释可私信获取
仿真结果
最后的准确率为91.58,和论文结果一致
【笔者过于懒,这里就没展示混淆矩阵…】
表格中其他的Rates,指的是输入图片忆阻器的形式和频率不同,但处理流程一直,更改的仅是步骤2与步骤4