神经网络Matlab代码纠错!较急!

#MATLAB求助:神经网络问题,比较急,应该是小错误,恳请解答!!
思路:Step1训练集与测试集用异常值剔除与归一处理得到的各指标数据随机作为验证的样本以及训练集,
Step2 BP神经网络的构建将函数将神经元的输入映射到输出端。
目前代码:

word0 = 'apple';
num_players0 = 100;
input = [date0, encode_word(word0), normalize_num_players(num_players0)];
input(2, :) = normalize(input(2, :)); % normalize date
output = net(input');
distribution = output';

function encode_date = encode_date(datestr)
% encode a date string as a 7-dimensional binary vector
encode_date = zeros(1, 7);
[year, month, day] = datevec(datestr);
encode_date(1) = mod(year, 4) == 0; % leap year
encode_date(2:13) = dec2bin(month, 4) - '0'; % month
encode_date(14:25) = dec2bin(day, 5) - '0'; % day
end
function vector = encode_word(word)
vector = zeros(1, 30);
for i = 1:length(word)
idx = (i - 1) * 5 + double(lower(word{i})) - double('a') + 1;
idx = max(min(idx, 30), 1); % limit the index to 1-25
vector(idx) = 1;
end
end
function normalize_num_players = normalize_num_players(num_players)
% normalize number of players to the range [0, 1]
normalize_num_players = (num_players - 10) / 990;
end

```
报错:错误使用 network/train
Inputs and targets have different numbers of samples.
求问怎么改,谢谢!

在你的代码中,你将输出数据 y 进行了转置操作 y_trans = transpose(y);,这意味着你的输出数据的维度由原来的 25 x 7 转换为了 7 x 25,而在神经网络训练时,你将输入数据和输出数据进行了拼接,拼接的方式为 [word_encoded, date_normalized, num_players_normalized]' 和 y_trans。这就要求输入数据和输出数据的样本数必须相等。因此,你需要对 y_trans 进行转置,使其与输入数据的样本数相等,即:

y_trans = y';

根据您提供的代码,似乎您的输入 ([word_encoded, date_normalized, num_players_normalized])' 的样本数是 25(因为您选择了前 25 行数据进行训练),而目标 y_trans 的样本数是 7(因为您选择了 7 列数据作为目标),这就是导致错误的原因。

解决方法是将 y 矩阵转置后作为目标,即 y_trans = transpose(y);,然后在训练模型时使用 y_trans 而不是 y,即 net = train(net, ([word_encoded, date_normalized, num_players_normalized])', y_trans);。

请尝试修改代码并再次运行,看看能否解决问题。

该回答引用ChatGPT

在给定的代码中,有一些问题需要解决。

1、encode_word函数中的vector应该是一个长度为25的向量,而不是30。

2、normalize_num_players函数中,分母应该是990而不是1000。

3、在训练神经网络之前,应该将输入和输出进行转置。因此,下面这一行代码:



net = train(net, ([word_encoded, date_normalized, num_players_normalized])', y_trans);
应该改为:

net = train(net, [word_encoded, date_normalized, num_players_normalized]', y_trans);

4、同样地,当用神经网络进行预测时,也需要将输入进行转置。因此,下面这一行代码:



output = net(input');
应该改为:


output = net(input);
encode_date函数未被使用,可以删除。


5、在函数normalize中,当输入是一行时,max和min函数的参数应该为2而不是1。

6、在训练神经网络之前,应该将输入和输出都进行归一化处理。可以使用mapminmax函数进行归一化处理。具体实现如下:


% normalize input and output
[input_normalized, input_settings] = mapminmax([word_encoded, date_normalized, num_players_normalized]');
[output_normalized, output_settings] = mapminmax(y_trans);

% train the model
net = train(net, input_normalized, output_normalized);

% predict num_attempts distribution for a specific input
input_normalized_0 = mapminmax('apply', [date0, encode_word(word0), normalize_num_players(num_players0)]', input_settings);
output_normalized_0 = net(input_normalized_0);
distribution = mapminmax('reverse', output_normalized_0', output_settings)';

你把代码文件发给我运行一下看看

这个错误通常是由于输入和目标数据的大小不匹配导致的。

在你的代码中,你的输入数据有30个样本,但是你的输出数据只有5个样本。这可能是导致该错误的原因。

具体来说,你需要检查以下代码行:

y

=raw(2:26, 9:15);

这里,你从Excel文件中读取了7个列,但只选取了第9到15列的数据作为输出数据y。确保输出数据的样本数量等于训练数据的样本数量。

如果你想使用第9到15列中的所有数据作为输出,你可以尝试将以下代码行更改为:

y = raw(2:26, 9:15)';


这将把y变成一个大小为[7, 25]的矩阵,其中每列对应一个训练样本的输出数据。

数据是这样的

img

根据您提供的代码,目前能够看到的是:

encode_date、encode_word 和 normalize_num_players 这三个函数没有使用到。
date、word 和 num_players 三个变量的处理方式和提取方法是正确的,但目前并没有被用到,因为在训练神经网络时只用到了它们的归一化结果。
读取了 Excel 文件中的数据,并将 num_players 和 y 的值提取出来,其中 y 表示每种单词在每天中出现的次数分布。
构建了一个有 5 个隐藏层、每个隐藏层都有 5 个神经元的前馈神经网络,并使用交叉熵作为性能函数,使用 Scaled Conjugate Gradient 作为训练函数来训练这个神经网络。
用训练好的神经网络对某一个输入进行预测。
从您提供的代码来看,似乎没有明显的错误。如果您遇到了某些错误或问题,请详细描述,我们将尽力帮助您解决问题。

请参考这个链接,https://blog.csdn.net/weixin_43935696/article/details/129111488%EF%BC%8C%E7%9C%8B%E5%AF%B9%E6%82%A8%E6%9C%89%E5%B8%AE%E5%8A%A9%E5%90%97%EF%BC%9F