Matlab的 - 神经网络训练(Matlab - Neural network training)

2019-08-01 12:29发布

我正在创建具有反向传播的一个2层的神经网络。 该NN应该从保持每行中以下信息20001x17矢量获取其数据:

-The第16个单元持有的整数范围从0到15,它作为变量来帮助我们确定我们的意思是看到那些变量时表示字母表中的26个字母的其中之一。 例如一系列16个值如下的意在表示字母A:[2 8 4 5 2 7 5 3 1 6 0 8 2 7 2 7]。

-The 17细胞持有数从1到26代表我们想要的字母表的字母。 1个代表A,2个代表乙等

在NN的输出层由26个输出的。 每次NN被供给像它上面描述的一个的输入的应该输出包含全零,但对应于该字母的是,输入值旨在代表一个小区1x26载体。 例如输出[1 0 0 ... 0]将是字母A,而[0 0 0 ... 1]将字母Z

有些东西在我目前的代码,重要的是:我需要使用traingdm函数和隐层数在21固定的(现在)。

试图创建上述概念我写了下面的MATLAB代码:

%%%%%%%%
%Start of code%
%%%%%%%%

%
%Initialize the input and target vectors
%
p = zeros(16,20001);
t = zeros(26,20001);

%
%Fill the input and training vectors from the dataset provided
%
for i=2:20001
    for k=1:16
        p(k,i-1) = data(i,k);
    end
    t(data(i,17),i-1) = 1;
end

net = newff(minmax(p),[21 26],{'logsig' 'logsig'},'traingdm');

y1 = sim(net,p);

net.trainParam.epochs = 200;
net.trainParam.show = 1;
net.trainParam.goal = 0.1;
net.trainParam.lr = 0.8;
net.trainParam.mc = 0.2;
net.divideFcn = 'dividerand';
net.divideParam.trainRatio = 0.7;
net.divideParam.testRatio = 0.2;
net.divideParam.valRatio = 0.1;

%[pn,ps] = mapminmax(p);
%[tn,ts] = mapminmax(t);

net = init(net);
[net,tr] = train(net,p,t);

y2 = sim(net,pn);

%%%%%%%%
%End of code%
%%%%%%%%

现在我的问题:我想被描述我的输出,即例如Y2向量的每一列应该是一个字母的表示。 我的代码没有做,虽然。 相反,它产生的0和1之间变化很大的效果,从0.1到0.9的值。

我的问题是:是否有一些转换,我需要做的是我不? 意思是,我一定要我的输入和/或输出数据转换为表格由我可以清楚地看到,如果我的NN正确地学习?

任何输入,将不胜感激。

Answer 1:

这个是正常的。 你的输出层采用对数S型传递函数,这将永远给你0和1之间的某个中间输出。

什么,你通常会做会寻找具有最大值的输出 - 换句话说,最有可能的字符。

这意味着,在每列y2 ,你正在寻找一个包含该行中最大的值的行的索引。 你可以计算这个如下:

[dummy, I]=max(y2);

I是然后将含有每行中的最大值的索引的矢量。



Answer 2:

如果Y2的一列表示你可以认为Y2的为每个输入26个英文字母字符中的一个输出的概率分布,例如:

.2
.5
.15
.15

然后其50%的概率,这是字符B(如果我们假设只有4个可能的输出)。



== ==备注

在NN的输出层由26个输出的。 每次NN被供给像它上面描述的一个的输入的应该输出包含全零,但对应于该字母的是,输入值旨在代表一个小区1x26载体。 例如输出[1 0 0 ... 0]将是字母A,而[0 0 0 ... 1]将字母Z

优选的是,避免使用的0,1目标值到网络的输出进行编码。
其原因避免0和1的目标值是“logsig”乙状结肠传递函数不能产生给定的权重的有限这些输出值。 如果您尝试对网络进行训练,以适应正好0和1的目标值,梯度下降将迫使权没有约束增长。
因此,而不是0和1值,尝试使用的0.04和0.9,例如值,使得[0.9,0.04,...,0.04]为字母A的目标输出向量。


参考:
托马斯M.米切尔,机器学习,麦格劳 - 希尔高等教育,1997,p114-115



Answer 3:

  1. 使用hardlin fcn输出层。
    1. 使用trainlmtrainrp训练网络。
    2. 要了解您的网络,使用for循环和比较输出和目标的条件。 当它是最好的使用,打破从学习循环退出。
    3. 用另一种方式,而不是mapminmax进行预处理的数据集。


Answer 4:

我不知道这是否构成一个实际的答案与否:但这里有一些言论。

  • 我不明白你的编码方案。 一个“A”是如何表示为一组数字? 它看起来像你落入使用任意数量的代码分类值的一个相当普遍的陷阱。 不这样做:如果“A”是1,例如,“b”为2和“c”是3,那么你的编码含蓄地说,“一个”更像是“B”不是“C”(因为网络具有实值输入序属性无关紧要)。 正确地做到这一点的方法是让表示为26的二进制值输入,其中只有一个是曾经活跃,代表字母每个字母。
  • 你的输出是正确的,在输出层的激活永远不会是0或1,但实数。 你可以采取的最大值为您的活动功能,但是这是有问题的,因为它不是可微,所以你不能使用回道具。 你应该做的是夫妇与输出SOFTMAX功能 ,使它们的和就是其中之一。 然后,您可以把输出的条件概率给出的投入,如果你愿意的话。 虽然该网络是没有明确的概率,与所述正确的活性和活化的功能是将在结构上是相同的对数 - 线性模型(可能与对应于隐藏层潜变量),和人做这一切的时候。

见大卫·麦凯的教科书了很好的介绍神经网络,这将明确概率连接。 看看从杰夫·辛顿的小组本文描述预测给出的正确表达和激活/活动功能的细节为背景的下一个字符的任务(虽然提防他们的方法是不平凡的,并使用一个经常性的网具有不同训练方法)。



文章来源: Matlab - Neural network training