为什么我的传输功能会继续回到'logsig'?

时间:2018-05-17 20:27:15

标签: matlab neural-network pattern-recognition

我尝试使用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。

1 个答案:

答案 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