0

2 つの torch.Tensor() オブジェクトで構成されるデータセットを使用して、Torch7 でディープ ニューラル ネットワークを実装しています。1 つ目は 12 要素 (completeTable) で構成され、もう 1 つは 1 要素 (presentValue) で構成されます。各データセットの行は、次の 2 つのテンソルの配列です。

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 に答える