我尝试使用patternnet命令构建一个基本的前馈系统,该命令可以识别来自MNIST数据集的数据。这是我的代码
one = [1];
one = repelem(one,100);
%%%%%%%%%%%%%%%Create Neural network%%%%%%%%%%%%%%%%%%%%%
nn = patternnet([100 100]);
nn.numInputs = 1;
nn.inputs{1}.size = 784;
nn.layers{1}.transferFcn = 'logsig';
nn.layers{2}.transferFcn = 'logsig';
nn.layers{3}.transferFcn = 'softmax';
nn.trainFcn = 'trainscg';
net.divideParam.trainRatio = 70/100;
net.divideParam.valRatio = 15/100;
net.divideParam.testRatio = 15/100;
%%%%%%%%%%%%%%%%Dealing with data%%%%%%%%%%%%%%%%%%%%%%%%%%
mnist_in = csvread('mnist_train_100.csv');
mnist_test_in = csvread('mnist_test_10.csv');
[i,j] = size(mnist_in);
data_in = mnist_in(:,2:785);
data_in = data_in';
target_in = mnist_in(:,1);
target_in = target_in';
nn = train(nn,data_in,target_in);
问题是当我构建这个系统时,输出层中的传递函数被设置为softmax函数。不知怎的,当我训练我的系统时,传递函数变成'logsig'功能,它一直保持这种状态,直到我清理我的工作区。我甚至尝试在代码中设置输出层的传递函数,程序仍然找到将其更改为logsig的方法。那么我能做些什么。
PS。我甚至尝试使用network()构建这个系统来制作所有内容,因为程序仍然会将我的传输功能从softmax更改为logsig。
答案 0 :(得分:0)
如我所见,divideParam
参数中存在错误。您将神经网络创建为nn
,但您更改的参数属于名为net
的变量。除此之外,创建神经网络部分是正常的。
我认为问题在于数据准备部分。
您的培训目标target_in
的维度为 1 x<样本数> 。因此,train
函数将'softmax'替换为'logsig'以适合输出。
softmax的输出数据应采用<的形式。结果数> x<样本数>
例如,输出为1,2或3.然后输出数组不应为
[1 2 1 3 3 1 ...]
但它应该是
[1 0 1 0 0 1 ...;
0 1 0 0 0 0 ...;
0 0 0 1 1 0 ...]
希望这有帮助。
编辑:将单个数组( 1 x<样本数> )转换为多个数组(<结果数> x<样本数> ),单个数组中的数据将使用索引进行映射。例如,单个数组中的11个样本:
[-1 -5.5 4 0 3.3 4 -1 0 0 0 -1]
检查所有唯一编号并对其进行排序。现在每个数字都有它的索引。
[-5.5 -1 0 3.3 4] #index table
通过单个数组,对于每个数字,将其放在正确的索引中。基本上,-1将具有索引2,因此我将在-1出现的任何列的第二行中打1。最后,
[ 0 1 0 0 0 0 0 0 0 0 0;
1 0 0 0 0 0 1 0 0 0 1; #there are three -1 in the single array
0 0 0 1 0 0 0 1 1 1 0;
0 0 0 0 1 0 0 0 0 0 0;
0 0 1 0 0 1 0 0 0 0 0]
以下是代码:
idx = sort(unique(target_in));
number_of_result = size(idx,2);
number_of_sample = size(target_in,2);
target_softmax = zeros(number_of_result,number_of_sample);
for i = 1:number_of_sample
place = find(idx == target_in(i)); % find the index of the value
target_softmax(place,i) = 1; % tick 1 at the row
end