一个简单的第三方CNN自编码matlab工具箱
使用到的是手写体数据库,该数据库已经集成到工具箱了,直接用就好,显示看一看该数据库的一部分,其目标就是通过训练该数据库达到识别的目的:
紧接着是对该数据库数据进行归一化等等预处理。nnsetup建立一个网络,里面会有许多参数初始化,同时在设置下opts.numepochs = 1; 该参数个人感觉就是将所有数据重复试验次数,设置1就是实验一次。opts.batchsize = 100;该参数是将大量样本每随机100个作为一波送进去实验。再就是训练测试了。
nnsetup:
function nn = nnsetup(architecture)
%NNSETUP创建前向神经网络
% nn = nnsetup(architecture) 返回一个神经网络结构,architecture为结构参数
% architecture 是一个n x 1 向量,表示每一层神经元的个数
%比如architecture=[784 100 10],表示输入层为784维输入,100个隐含层,10个输出层
%为什么是输入为784:因为每一个手写体大小为28*28的,也就是784维度
%隐含层为什么是100:随便设置的,可以随意修改,需要设计
%输出为什么是10:手写体有0-9这10种结果,所以为10nn.size = architecture;nn.n = numel(nn.size);nn.activation_function = 'tanh_opt'; % 隐含层激活函数: 'sigm' (sigmoid) or 'tanh_opt' (默认 tanh).nn.learningRate = 2; % 学习率: typically needs to be lower when using 'sigm' activation function and non-normalized inputs.nn.momentum = 0.5; % Momentum 权值动量因子nn.scaling_learningRate = 1; % 学习率变化因子 (each epoch)nn.weightPenaltyL2 = 0; % L2 regularization正则化nn.nonSparsityPenalty = 0; % 非稀疏惩罚nn.sparsityTarget = 0.05; % 稀疏目标值nn.inputZeroMaskedFraction = 0; % 自动编码的去噪作用nn.dropoutFraction = 0; % Dropout level (http://www.cs.toronto.edu/~hinton/absps/dropout.pdf)nn.testing = 0; % Internal variable. nntest sets this to one.nn.output = 'sigm'; % 输出激活output unit 'sigm' (=logistic), 'softmax' and 'linear'for i = 2 : nn.n % weights and weight momentumnn.W{i - 1} = (rand(nn.size(i), nn.size(i - 1)+1) - 0.5) * 2 * 4 * sqrt(6 / (nn.size(i) + nn.size(i - 1)));nn.vW{i - 1} = zeros(size(nn.W{i - 1}));% average activations (for use with sparsity)nn.p{i} = zeros(1, nn.size(i)); end
end
这个函数理解起来很简单,初始化网络,网络需要什么初始化什么,一大堆初始化是适应所有的网络的(cnn,dbn等等),有些用到了再说吧,现在你只需要知道网络的结构,以及与稀疏编码表示有关的参数: nn.nonSparsityPenalty ,nn.sparsityTarget,这也就是上节说到的,为什么稀疏表示,具体怎么样不用管,实际使用的时候只是这么几个参数设置,其他的交给程序吧。再有就是注意下激活函数 nn.activation_function。,然后网络权值随机初始化。
这里再说下这个函数整体:[nn, L] = nntrain(nn, train_x, train_y, opts);
可以看到nntrain需要的是设计的网络nn,训练数据train_x,训练对应的目标值train_y,以及附加参数opts。附加参数包括:重复训练次数opts.numepochs,训练数据每一块大小opts.batchsize等等。函数出来的就是训练好的网络nn,这个很重要,训练好的nn为结构体,里面包括你所需要的所有信息,比如说每一层网络的权值系数,训练误差,等等都可以找到,并且在nntest也是用这个训练好的nn。nntrain的具体实现细节见上面那个博客的介绍吧。
nntrain
setup大概就这样一个过程,下面就到了train了,打开\NN\nntrain.m
我们跳过那些检验传入数据是否正确的代码,直接到关键的部分
denoising 的部分请参考论文:Extracting and Composing Robust Features with Denoising Autoencoders
m = size(train_x, 1);
//m是训练样本的数量
//注意在调用的时候我们设置了opt,batchsize是做batch gradient时候的大小
batchsize = opts.batchsize; numepochs = opts.numepochs;
numbatches = m / batchsize; //计算batch的数量,训练样本的总个数除以一个batch的 size,得到batch的总数目
assert(rem(numbatches, 1) == 0, 'numbatches must be a integer');//即上一步 对总数据进行分组,组数应是一个整数
L = zeros(numepochs*numbatches,1);
n = 1;
//numepochs是循环的次数
for i = 1 : numepochs tic; // tic用来保存当前时间,而后使用toc来记录程序完成时间。kk = randperm(m); //把batches打乱顺序进行训练,randperm(m)功能是随机打乱一个数字序列,生成一个 乱序的1到m的数组。例如 randperm(5),ans = 2 3 4 1 5for l = 1 : numbatches batch_x = train_x(kk((l - 1) * batchsize + 1 : l * batchsize), :); //Add noise to input (for use in denoising autoencoder) //加入noise,这是denoising autoencoder需要使用到的部分 //这部分请参见《Extracting and Composing Robust Features with Denoising Autoencoders》这篇论文 //具体加入的方法就是把训练样例中的一些数据调整变为0,inputZeroMaskedFraction表示了调整的比例 if(nn.inputZeroMaskedFraction ~= 0) batch_x = batch_x*
(rand(size(batch_x))>nn.inputZeroMaskedFraction); end batch_y = train_y(kk((l - 1) * batchsize + 1 : l * batchsize), :); //这三个函数 //nnff是进行前向传播,nnbp是后向传播,nnapplygrads是进行梯度下降 //我们在下面分析这些函数的代码 nn = nnff(nn, batch_x, batch_y); nn = nnbp(nn); nn = nnapplygrads(nn); L(n) = nn.L; n = n + 1; end t = toc; if ishandle(fhandle) if opts.validation == 1 loss = nneval(nn, loss, train_x, train_y, val_x, val_y); else loss = nneval(nn, loss, train_x, train_y); end nnupdatefigures(nn, fhandle, loss, opts, i); end disp(['epoch ' num2str(i) '/' num2str(opts.numepochs) '. Took ' num2str(t) ' seconds' '. Mean squared error on training set is ' num2str(mean(L((n-numbatches):(n-1))))]); nn.learningRate = nn.learningRate * nn.scaling_learningRate;
end
下面分析三个函数nnff,nnbp和nnapplygrads
nnff
nnff就是进行feedforward pass,其实非常简单,就是整个网络正向跑一次就可以了
当然其中有dropout和sparsity的计算
具体的参见论文“Improving Neural Networks with Dropout“和Autoencoders and Sparsity
function nn = nnff(nn, x, y)
//NNFF performs a feedforward pass
// nn = nnff(nn, x, y) returns an neural network structure with updated
// layer activations, error and loss (nn.a, nn.e and nn.L) n = nn.n; m = size(x, 1); x = [ones(m,1) x]; nn.a{1} = x; //feedforward pass for i = 2 : n-1 //根据选择的激活函数不同进行正向传播计算 //你可以回过头去看nnsetup里面的第一个参数activation_function //sigm就是sigmoid函数,tanh_opt就是tanh的函数,这个toolbox好像有一点改变 //tanh_opt是1.7159*tanh(2/3.*A) switch nn.activation_function case 'sigm' // Calculate the unit's outputs (including the bias term) nn.a{i} = sigm(nn.a{i - 1} * nn.W{i - 1}'); case 'tanh_opt' nn.a{i} = tanh_opt(nn.a{i - 1} * nn.W{i - 1}'); end //dropout的计算部分部分 dropoutFraction 是nnsetup中可以设置的一个参数 if(nn.dropoutFraction > 0) if(nn.testing) nn.a{i} = nn.a{i}.*(1 - nn.dropoutFraction); else nn.dropOutMask{i} = (rand(size(nn.a{i}))>nn.dropoutFraction); nn.a{i} = nn.a{i}.*nn.dropOutMask{i}; end end //计算sparsity,nonSparsityPenalty 是对没达到sparsitytarget的参数的惩罚系数 //calculate running exponential activations for use with sparsity if(nn.nonSparsityPenalty>0) nn.p{i} = 0.99 * nn.p{i} + 0.01 * mean(nn.a{i}, 1); end //Add the bias term nn.a{i} = [ones(m,1) nn.a{i}]; end switch nn.output case 'sigm' nn.a{n} = sigm(nn.a{n - 1} * nn.W{n - 1}'); case 'linear' nn.a{n} = nn.a{n - 1} * nn.W{n - 1}'; case 'softmax' nn.a{n} = nn.a{n - 1} * nn.W{n - 1}';//这里的n就是循环n-1里时那个具体的数,代表最后一层输出层(不参与循环) nn.a{n} = exp(bsxfun(@minus, nn.a{n}, max(nn.a{n},[],2)));
//max这种表达的意思比较并取每一行的最大值,结果为列向量。nn.a{n} = bsxfun(@rdivide, nn.a{n}, sum(nn.a{n}, 2)); // bsxfun代表高效运算,指两个数组间元素逐个计算的二值操作,@rdivide 这里指左除;@minus是减法end //error and loss //计算error nn.e = y - nn.a{n}; //计算计算loss 函数 switch nn.output case {'sigm', 'linear'} nn.L = 1/2 * sum(sum(nn.e .^ 2)) / m; case 'softmax' nn.L = -sum(sum(y .* log(nn.a{n}))) / m; end
end
nnbp
代码:\NN\nnbp.m
nnbp呢是进行back propagation的过程,过程还是比较中规中矩,和ufldl中的Neural Network讲的基本一致
值得注意的还是dropout和sparsity的部分
if(nn.nonSparsityPenalty>0) pi = repmat(nn.p{i}, size(nn.a{i}, 1), 1); sparsityError = [zeros(size(nn.a{i},1),1) nn.nonSparsityPenalty * (-nn.sparsityTarget ./ pi + (1 - nn.sparsityTarget) ./ (1 - pi))];
end // Backpropagate first derivatives
if i+1==n % in this case in d{n} there is not the bias term to be removed d{i} = (d{i + 1} * nn.W{i} + sparsityError) .* d_act; // Bishop (5.56)
else // in this case in d{i} the bias term has to be removed d{i} = (d{i + 1}(:,2:end) * nn.W{i} + sparsityError) .* d_act;
end if(nn.dropoutFraction>0) d{i} = d{i} .* [ones(size(d{i},1),1) nn.dropOutMask{i}];
end
这只是实现的内容,代码中的d{i}就是这一层的delta值,在ufldl中有讲的
dW{i}基本就是计算的gradient了,只是后面还要加入一些东西,进行一些修改
具体原理参见论文“Improving Neural Networks with Dropout“ 以及 Autoencoders and Sparsity的内容
nnapplygrads
代码文件:\NN\nnapplygrads.m
for i = 1 : (nn.n - 1) if(nn.weightPenaltyL2>0) dW = nn.dW{i} + nn.weightPenaltyL2 * nn.W{i}; else dW = nn.dW{i}; end dW = nn.learningRate * dW; if(nn.momentum>0) nn.vW{i} = nn.momentum*nn.vW{i} + dW; dW = nn.vW{i}; end nn.W{i} = nn.W{i} - dW;
end
这个内容就简单了,nn.weightPenaltyL2 是weight decay的部分,也是nnsetup时可以设置的一个参数
有的话就加入weight Penalty,防止过拟合,然后再根据momentum的大小调整一下,最后改变nn.W{i}即可
nntest
Ok再来看看nntest,如下:
function [ri, right] = nntest(nn, x, y)labels = nnpredict(nn, x);[~, expected] = max(y,[],2);right = find(labels == expected); ri = numel(right) / size(x, 1);
end
调用一下nnpredict。函数需要的就是测试数据x和标签y,如果有y的话那么可以计算准确率,如果没有y的话那么你可以自己直接调用 labels = nnpredict(nn, x)可以得到预测的标签。
nnpredict
代码文件:\NN\nnpredict.m
[cpp] view plain copy
- function labels = nnpredict(nn, x)
- nn.testing = 1;
- nn = nnff(nn, x, zeros(size(x,1), nn.size(end)));
- nn.testing = 0;
- [~, i] = max(nn.a{end},[],2);
- labels = i;
- end
继续非常简单,predict不过是nnff一次,得到最后的output~~
max(nn.a{end},[],2); 是返回每一行的最大值以及所在的列数,所以labels返回的就是标号啦
(这个test好像是专门用来test 分类问题的,我们知道nnff得到最后的值即可)
一个简单的第三方CNN自编码matlab工具箱相关推荐
- 如何安装第三方站点下载的Matlab工具箱或硬件支持包,亲测有效。
如何安装第三方站点下载的Matlab工具箱或硬件支持包,亲测有效. 背景说明 安装方法 说明 背景说明 今天给大家说一说,有时候我们下载Matlab官方的工具箱或者硬件支持包会出现下载时间过长,下载到 ...
- 【javamatlab】以一个简单的例子实现java和matlab混编
目录 使用环境: MATLAB: matlab代码: 将matlab代码打包: eclipse: jar包配置: 使用jar包: 使用环境: jdk8(ide使用eclipse2019-6).matl ...
- matlab 卷积神经网络工具,CNN卷积神经网络MATLAB工具箱中文注释版
[实例简介] 该工具箱包含CNN,NN,CAE,DBN,SAE等神经网络工具箱.其中CNN工具箱具有详细的中文注释,以便于初学者学习 [实例截图] [核心代码] DeepLearnToolbox └─ ...
- 神经网络学习笔记2.2 ——用Matlab写一个简单的卷积神将网络图像分类器
配套视频讲解 10分钟学会matlab实现cnn图像分类_哔哩哔哩_bilibili 10分钟学会matlab实现cnn图像分类 整体代码 链接:https://pan.baidu.com/s/1bt ...
- fastslam matlab,fastslam 快速定位和构图的源码,一个简单的例子,3D建模,可以用作学习智能机器人自主移动 matlab 272万源代码下载- www.pudn.com...
文件名称: fastslam下载 收藏√ [ 5 4 3 2 1 ] 开发工具: matlab 文件大小: 31 KB 上传时间: 2015-03-19 下载次数: 22 详细说明:快速定 ...
- matlab求解一元四次函数,excel数据函数参数是四个吗|求一个简单的一元四次函数的最大值...
求四次函数的最值 先求导,令导数等于0,求出x的值,判断单调性,将x代入原函数 4次幂的一元函数怎么计算 解析: (1) 四次方程,有通用求根公式. A 此公式复杂,实际使用较麻烦 B 其推导过程中可 ...
- 一个简单的微分对策问题求解及其Matlab实现
一个简单的微分对策问题求解及其Matlab实现 理论知识 [例题] 思考 理论知识 注:本文为<最优控制方法与Matlab实现>第八章 微分对策问题的实现.给出了文中例题的解法,以及mat ...
- 【Pytorch分布式训练】在MNIST数据集上训练一个简单CNN网络,将其改成分布式训练
文章目录 普通单卡训练-GPU 普通单卡训练-CPU 分布式训练-GPU 分布式训练-CPU 租GPU服务器相关 以下代码示例基于:在MNIST数据集上训练一个简单CNN网络,将其改成分布式训练. 普 ...
- 一个简单的MATLAB脚本——快速行进算法(FMM))
一个简单的MATLAB脚本--快速行进算法(FMM) 介绍快速行进算法(FMM)的简单MATLAB脚本,不到20行代码实现快速行进算法的运算结果,而且计算速度非常快.给了两个实例模型来说明计算结果. ...
最新文章
- .net工具类 分享一个简单的随机分红包的实现方式
- UE4学习-在虚幻编辑器中打开VS的三种方式
- 中移动飞信2010Beta1.0体验版
- FlatBuffers要点
- 2020中国高校薪资排行出炉!好过双一流的高校原来这么多!| 留言送书
- blink usb无线网卡驱动 linux,最新blink随身wifi驱动下载地址电脑版-CC软件
- 论文中引用的标注方法
- linux gns3使用教程,Linux下GNS3报错解决方法
- Atitit 软件体系的进化,是否需要一个处理中心
- C#调用电脑的默认图片浏览器软件打开图片
- MATLAB基础篇——基本语法
- ps怎么放大图片保持清晰度?
- 野芭蕉V1.1.1-15.0429.1338
- jfreechart-x轴刻度倾斜45度
- 二维码扫描枪对接手册
- 坚果手机2系统相册问题
- Codeforces Round #643 (Div. 2) C. Count Triangles 题解(思维)
- 蒋涛:TUP,分享产品背后的技术和用户体验
- C Primer Plus(6) 中文版 第3章 数据和C 3.4 C语言基本数据类型
- Python:创建函数判断闰年