http://www.cnblogs.com/bellkosmos/p/5598439.html
由于需要在一个Android项目中使用神经网络,而经过测试发现几个Github上开源项目的训练效果就是不如Matlab的工具箱好,所以就想在Android上使用Matlab神经网络代码(可是。。。)
这个问题大概处理了两天,原本预计5个小时的。。。
过程遇到了诸多一手坑以及看到相关资料的对新手不友好,所以就把过程记录下来希望能给后来者一些帮助
这个教程从0开始讲如何在Android App中使用Matlab的神经网络代码
整个过程大概可以分成这么几步:
- 首先你要在Matlab中写一个完整的神经网络
- 获取样本
- 样本导入
- 神经网络建模
- 神经网络训练
- 神经网络测试(优化建模)
- 然后你要在Matlab中重写一个神经网络,第二个神经网络的特殊之处是
- 首先这个神经网络必须写成函数,具体有几个细节
- 把第一个神经网络的训练结果net网络保存成mat文件
- 把相关需要用的但无法直接写入代码的数据也保存成mat文件(比如数据归一化的参数)
- 然后在函数中把上面几个mat文件导入,基本上就是一个完整的神经网络模型了
- 再加上一个神经网络计算语句,并把结果返回,这个函数就完成了
- 然后把这个Matlab神经网络函数进行打包,打包的结果是一个jar包
- 然后把这个jar包连同另一个jar包一块导入Andorid工程,并添加为外部依赖
- 最后在Android工程中写一个专门调用这个jar包接口代码的函数,传入输入变量,返回计算结果
- ()
1.在Matlab中写一个完整的神经网络
1.1.获取样本就不说了
1.2.样本导入
如何导入数据呢,一般matlab中有通用的数据存储格式,那就是Mat格式,但是我并不知道怎么编写这个格式
在我发现有办法可以把txt中的数据导入进去之后我就选定它了,因为这种格式也非常方便我用android输出,也就是说它是一种比较通用的信息交换格式
具体的操作方法非常简单:
- 你在txt中按这种格式保存数据:每行用回车隔开,每列用空格隔开
- 然后你在matlab中load这个文件,就能得到一个数据的矩阵了
代码如下:
alldata = load('alldata.txt');
alldata = alldata(:,:);
|
1.3. 1.4. 1.5. 这几个过程照着代码修改还是比较简单的(虽然matlab很久没用让我当时读得有点困难。。。),稍微提这么几点:
- (把经典书目《MATLAB神经网络30个案例分析》的源码包放到工作路径再进行阅读修改)
- 输出数据需要进行一下矩阵转换
- 使用newff工具函数来构建神经网络,使用matlab内部的工具箱(其实就是库函数)来建模、训练和计算,不需要自己写逻辑代码
- 中间各种矩阵的变换感觉不是很习惯,可以参看一下工作空间里的变量状态,或者一步步打印一些变量的结果来看
clc;
clear;
%导入300组数据
alldata = load('alldata.txt');
alldata = alldata(:,:);
%输入输出数据
input = alldata(:,2:33);
outputtemp = alldata(:,1);
%输出数据需要处理一下
output = zeros(300,2);%预先分配内存
for i=1:300
switch outputtemp(i)
case 0
output(i,:) = [1 0];%意思是如果数据结果是0,则输出层的状态是[1 0],或者用第一个输出节点表示
case 1 %能直接识别带小数位的数据
output(i,:) = [0 1];
end
end
%从中随机抽取280组数据作为训练数据,20组数据作为预测数据
k = rand(1,300);
[m,n] = sort(k);
input_train = input(n(1:280),:)';
output_train = output(n(1:280),:)';
input_test = input(n(281:300),:)';
output_test = output(n(281:300),:)';
%输入输出数据进行归一化处理
[inputn,inputps] = mapminmax(input_train);
[outputn,outputps] = mapminmax(output_train);
%网络结构构建32-6-2
net=newff(inputn,outputn,6);
%网络参数配置(迭代次数,学习率,目标)
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
net.trainParam.goal=0.0004;
%网络训练
net=train(net,inputn,outputn);
%BP网络预测
%预测数据归一化
inputn_test=mapminmax('apply',input_test,inputps);
%网络预测输出
an=sim(net,inputn_test);
%网络输出反归一化
BPoutput=mapminmax('reverse',an,outputps);
%结果分析
figure(1)
plot(BPoutput,':og')
hold on
plot(output_test,'-*');
legend('预测输出','期望输出')
title('BP网络预测输出','fontsize',12)
ylabel('函数输出','fontsize',12)
xlabel('样本','fontsize',12)
%预测误差
error=BPoutput-output_test;
figure(2)
plot(error,'-*')
title('BP网络预测误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)
figure(3)
plot((output_test-BPoutput)./BPoutput,'-*');
title('神经网络预测误差百分比')
errorsum = sum(abs(error))
|
最后输出的结果还可以,虽然正确率一般,因为样本太少 。但是还能接受,是可以解释的结果: