我正在努力创建一个具有反向传播的 2 层神经网络。神经网络应该从 20001x17 向量获取数据,该向量在每行中包含以下信息:
- 前 16 个单元格包含从 0 到 15 的整数,它们充当变量,帮助我们确定在看到这些变量时要表达的 26 个字母中的哪一个。例如,如下一系列 16 个值旨在表示字母 A:[2 8 4 5 2 7 5 3 1 6 0 8 2 7 2 7]。
- 第 17 个单元格包含一个从 1 到 26 的数字,代表我们想要的字母表中的字母。 1代表A,2代表B等。
神经网络的输出层由 26 个输出组成。每次向神经网络输入如上所述的输入时,它都应该输出一个 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。
我的问题是:是否有一些我需要做而我没有做的转换?意思是,我是否必须将输入和/或输出数据转换为一种形式,通过这种形式我可以真正看到我的神经网络是否正确学习?
任何意见将不胜感激。