2

詳細を学ぶために、Torch に単純な NN を実装しようとしています。非常に単純なデータセットを作成しました: 0 から 15 までの 2 進数で、私の目標は数値を 2 つのクラスに分類することです。クラス 1 は数値 0-3 と 12-15 で、クラス 2 は残りの数値です。次のコードは私が今持っているものです (データ読み込みルーチンのみを削除しました):

require 'torch'
require 'nn'

data = torch.Tensor( 16, 4 )
class = torch.Tensor( 16, 1 )

network = nn.Sequential()

network:add( nn.Linear( 4, 8 ) )
network:add( nn.ReLU() )
network:add( nn.Linear( 8, 2 ) )
network:add( nn.LogSoftMax() )

criterion = nn.ClassNLLCriterion()

for i = 1, 300 do
        prediction = network:forward( data )

        --print( "prediction: " .. tostring( prediction ) )
        --print( "class: " .. tostring( class ) )

        loss = criterion:forward( prediction, class )

        network:zeroGradParameters()

        grad = criterion:backward( prediction, class )
        network:backward( data, grad )

        network:updateParameters( 0.1 )
end

これは、データとクラスのテンソルがどのように見えるかです:

 0  0  0  0
 0  0  0  1
 0  0  1  0
 0  0  1  1
 0  1  0  0
 0  1  0  1
 0  1  1  0
 0  1  1  1
 1  0  0  0
 1  0  0  1
 1  0  1  0
 1  0  1  1
 1  1  0  0
 1  1  0  1
 1  1  1  0
 1  1  1  1
[torch.DoubleTensor of size 16x4]

 2
 2
 2
 2
 1
 1
 1
 1
 1
 1
 1
 1
 2
 2
 2
 2
[torch.DoubleTensor of size 16x1]

それが私が期待していることです。ただし、このコードを実行すると、 line loss = criteria:forward( predict, class )で次のエラーが発生します。

torch/install/share/lua/5.1/nn/ClassNLLCriterion.lua:69: nil 値に対して演算を実行しようとしました

このようにトレーニング ルーチンを変更すると (バッチで 16 個すべてのデータ ポイントを処理するのではなく、一度に 1 つのデータ ポイントを処理する)、それが機能し、ネットワークは 2 つのクラスを認識することを正常に学習します。

for k = 1, 300 do
for i = 1, 16 do
        prediction = network:forward( data[i] )

        --print( "prediction: " .. tostring( prediction ) )
        --print( "class: " .. tostring( class ) )

        loss = criterion:forward( prediction, class[i] )

        network:zeroGradParameters()

        grad = criterion:backward( prediction, class[i] )
        network:backward( data[i], grad )

        network:updateParameters( 0.1 )
end
end

私が行おうとしている「バッチ処理」の何が問題なのかわかりません。ClassNLLCriterion を簡単に見ても役に立ちませんでした。期待される入力 (以下を参照) を与えているようですが、それでも失敗します。受け取る入力 (予測とクラス テンソル) は次のようになります。

-0.9008 -0.5213
-0.8591 -0.5508
-0.9107 -0.5146
-0.8002 -0.5965
-0.9244 -0.5055
-0.8581 -0.5516
-0.9174 -0.5101
-0.8040 -0.5934
-0.9509 -0.4884
-0.8409 -0.5644
-0.8922 -0.5272
-0.7737 -0.6186
-0.9422 -0.4939
-0.8405 -0.5648
-0.9012 -0.5210
-0.7820 -0.6116
[torch.DoubleTensor of size 16x2]

 2
 2
 2
 2
 1
 1
 1
 1
 1
 1
 1
 1
 2
 2
 2
 2
[torch.DoubleTensor of size 16x1]

誰かがここで私を助けてくれますか? ありがとう。

4

1 に答える 1