0

我正在 Torch7 中实现一个深度神经网络,其数据集由两个 torch.Tensor() 对象组成。第一个由 12 个元素组成(completeTable),另一个由 1 个元素组成(presentValue)。每个数据集行都是这两个张量的数组:

dataset[p] = {torch.Tensor(completeTable[p]), torch.Tensor(presentValue)};

一切都适用于神经网络训练和测试。但是现在我想切换并只使用 completeTable 的 12 个元素中的一半,即只有 6 个元素(firstChromRegionProfile)。

dataset_firstChromRegion[p] = {torch.Tensor(firstChromRegionProfile), torch.Tensor(presentValue)};

如果我用这个新数据集运行相同的神经网络架构,它就不起作用。它说 trainer:train(dataset_firstChromRegion) 函数由于“大小不匹配”而无法工作。

这是我的神经网络功能:

-- Neural network application
function neuralNetworkApplication(input_number, output_number, datasetTrain, datasetTest, dropOutFlag, hiddenUnits, hiddenLayers)

      require "nn"
    -- act_function = nn.Sigmoid();
    act_function = nn.Tanh();

    print('input_number '.. input_number);
    print('output_number '.. output_number);

      -- NEURAL NETWORK CREATION - <START>

      perceptron=nn.Sequential();  -- make a multi-layer perceptron
      perceptron:add(nn.Linear(input_number, hiddenUnits));
      perceptron:add(act_function);
      if dropOutFlag==TRUE then perceptron:add(nn.Dropout()) end  -- DROPOUT

        -- we add w layers DEEP LEARNING
      for w=0, hiddenLayers do
          perceptron:add(nn.Linear(hiddenUnits,hiddenUnits)) -- DEEP LEARNING layer
          perceptron:add(act_function); -- DEEP LEARNING 
          if dropOutFlag==TRUE then 
        perceptron:add(nn.Dropout())  -- DROPOUT
          end
      end

    print('\n#datasetTrain '.. #datasetTrain);
    print('#datasetTrain[1] '.. #datasetTrain[1]);
    print('(#datasetTrain[1][1])[1] '..(#datasetTrain[1][1])[1]);
    print('\n#datasetTest '.. #datasetTest);
    print('#datasetTest[1] '.. #datasetTest[1]);
    print('(#datasetTest[1][1])[1] '..(#datasetTest[1][1])[1]);

      perceptron:add(nn.Linear(hiddenUnits, output_number));
      perceptron:add(act_function);

      criterion = nn.MSECriterion();  -- MSE: Mean Square Error
      trainer = nn.StochasticGradient(perceptron, criterion)
      trainer.learningRate = LEARNING_RATE_CONST;
      trainer:train(datasetTrain);

      idp=3;
      predValueVector={}
      for i=1,(#datasetTest) do
        pred=perceptron:forward(datasetTest[i][1]);  -- get the prediction of the perceptron 
        predValueVector[i]=pred[1];     
      end

      -- NEURAL NETWORK CREATION - <END>

    return predValueVector;

end

这是错误日志:

input_number 6  
output_number 1 

#datasetTrain 13416 
#datasetTrain[1] 2  
(#datasetTrain[1][1])[1] 6  

#datasetTest 3354   
#datasetTest[1] 2   
(#datasetTest[1][1])[1] 6   
# StochasticGradient: training  
/mnt/work1/software/torch/7/bin/luajit: /mnt/work1/software/torch/7/share/lua/5.1/nn/Linear.lua:71: size mismatch
stack traceback:
    [C]: in function 'addmv'
    /mnt/work1/software/torch/7/share/lua/5.1/nn/Linear.lua:71: in function 'updateGradInput'
    /mnt/work1/software/torch/7/share/lua/5.1/nn/Sequential.lua:36: in function 'updateGradInput'
    ...software/torch/7/share/lua/5.1/nn/StochasticGradient.lua:37: in function 'train'
    siamese_neural_network.lua:278: in function 'neuralNetworkApplication'
    siamese_neural_network.lua:223: in function 'kfold_cross_validation_separate'
    siamese_neural_network.lua:753: in main chunk
    [C]: in function 'dofile'
    ...1/software/torch/7/lib/luarocks/rocks/trepl/scm-1/bin/th:131: in main chunk
    [C]: at 0x004057d0
4

2 回答 2

1

您的所有激活层共享同一个nn.Tanh()对象。那就是问题所在。尝试这样的事情:

act_function = nn.Tanh
perceptron:add( act_function() )

为什么?

要执行反向传播步骤,我们必须根据其输入计算层的梯度。在我们的例子中:

tanh'(输入) = 1 - tanh(输入) ^2

可以注意到tanh(input) =层前向步骤的输出。您可以将此输出存储在层内,并在反向传递期间使用它来加速训练。这正是nn图书馆内部发生的事情:

// torch/nn/generic/Tanh.c/Tanh_updateGradInput:

for(i = 0; i < THTensor_(nElement)(gradInput); i++)
    {
        real z = ptr_output[i];
        ptr_gradInput[i] = ptr_gradOutput[i] * (1. - z*z);
    }

激活层的输出大小不匹配,因此会发生错误。即使他们这样做了,也会导致错误的结果。

对不起我的英语。

于 2015-05-29T14:10:41.920 回答
0

通过消除以下行,我出人意料地能够解决我的问题:

act_function = nn.Tanh();

并因此通过替换任何出现act_functionnn.Tanh()

我不知道为什么,但知道一切正常......所以教训是:永远不要将激活函数分配给变量(!?)。

于 2015-05-22T17:38:57.957 回答