-前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等。
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不等。
我的问题是:我需要进行某些转换吗?也就是说,我是否需要将我的输入和/或输出数据转换为一种形式,以便我可以实际上看到我的神经网络是否正在正确地学习?
任何意见都将不胜感激。