gpt4 book ai didi

Matlab - 神经网络训练

转载 作者:太空宇宙 更新时间:2023-11-03 19:45:13 24 4
gpt4 key购买 nike

我正在致力于创建一个具有反向传播的 2 层神经网络。 NN 应该从一个 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等。

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。

我的问题是:是否有一些我需要做但我没有做的转换?意思是,我是否必须将我的输入和/或输出数据转换为一种形式,通过这种形式我可以实际查看我的神经网络是否正在正确学习?

如有任何意见,我们将不胜感激。

最佳答案

这是正常的。您的输出层使用 log-sigmoid 传递函数,它总是会为您提供介于 0 和 1 之间的一些中间输出。

您通常会做的是寻找具有最大值的输出——换句话说,最有可能的字符。

这意味着,对于 y2 中的每一列,您要查找包含该行中最大值的行的索引。您可以按如下方式计算:

[dummy, I]=max(y2);

I 是一个向量,其中包含每行中最大值的索引。

关于Matlab - 神经网络训练,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1291027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com