0

Lasagne パッケージを使用して単純な 3 層ニューラル ネットワークを構築し、非常に単純なデータセット (4 つの例のみ) でテストしています。

X = np.array([[0,0,1],
              [0,1,1],
              [1,0,1],
              [1,1,1]])         

y = np.array([[0, 0],[1, 0],[1, 1],[0, 1]])

ただし、これを学習できず、次の予測になります。

pred = theano.function([input_var], [prediction])
np.round(pred(X), 2)
array([[[ 0.5 ,  0.5 ],
        [ 0.98,  0.02],
        [ 0.25,  0.75],
        [ 0.25,  0.75]]])

完全なコード:

def build_mlp(input_var=None):
    l_in = lasagne.layers.InputLayer(shape=(None, 3), input_var=input_var)
    l_hid1 = lasagne.layers.DenseLayer(
        l_in, num_units=4,
        nonlinearity=lasagne.nonlinearities.rectify,
        W=lasagne.init.GlorotUniform())
    l_hid2 = lasagne.layers.DenseLayer(
        l_hid1, num_units=4,
        nonlinearity=lasagne.nonlinearities.rectify,
        W=lasagne.init.GlorotUniform())
    l_out = lasagne.layers.DenseLayer(
        l_hid2, num_units=2,
        nonlinearity=lasagne.nonlinearities.softmax)
    return l_out

input_var = T.lmatrix('inputs')
target_var = T.lmatrix('targets')

network = build_mlp(input_var)

prediction = lasagne.layers.get_output(network, deterministic=True)
loss = lasagne.objectives.squared_error(prediction, target_var)
loss = loss.mean()

params = lasagne.layers.get_all_params(network, trainable=True)
updates = lasagne.updates.nesterov_momentum(
    loss, params, learning_rate=0.01, momentum=0.9)

train_fn = theano.function([input_var, target_var], loss, updates=updates)
val_fn = theano.function([input_var, target_var], [loss])

トレーニング:

num_epochs = 1000
for epoch in range(num_epochs):
    inputs, targets = (X, y)
    train_fn(inputs, targets)   

隠れ層で使われている非線形関数か、学習方法に問題があるのではないかと推測しています。

4

2 に答える 2

0

以上のことから、モデルが正しく学習しているかどうかを判断することはできないように感じます。

  1. トレーニング インスタンスの数 4 つのトレーニング インスタンスがあります。構築したニューラル ネットワークには、学習する必要がある 3*4 + 4*4 + 4*2 = 36 個の重みが含まれています。言うまでもなく、4 種類の出力があります。ネットワークは間違いなく適合不足であり、予期しない結果を説明する可能性があります。

  2. モデルが機能しているかどうかを テストする方法 ニューラル ネットワークが正しく学習しているかどうかをテストする場合は、作業中のデータセット (MNIST など) でテストし、モデルが高い確率で学習していることを確認します。既に作成した別のニューラル ネットワーク ライブラリや文献と比較することもできます。本当にミクロに行きたいのなら、線形分離可能なデータセットでブースティングを使用します。

あなたのモデルがまだ適切に学習しない場合、私は心配します。

于 2016-03-27T06:22:18.720 に答える
0

これは問題に対する私の推測です。

[0,0]まず、なぜ?のような出力があるのか​​わかりません。サンプルがすべてのクラスに分類されていないということですか?

第二に、通常は分類に使用する最後のレイヤーでSoftmaxを使用していますが、このネットワークを分類用に構築していますか? 出力について混乱している場合、出力は実際には各クラスの確率なので、出力は正しいと思います:

  • 2番目のサンプル予測は[0.98 0.02]、2番目のサンプルがターゲットのように最初のクラスに属していることを意味します[1 0]

  • 3番目のサンプル予測は[0.25 0.75]、3番目のサンプルがターゲットのように2番目のクラスに属していることを意味します[1 1](最初のクラスの値に関係なく、それは分類であるため、システムによる正しい分類としてカウントされます)

  • 4番目のサンプル予測は[0.25 0.75]、4番目のサンプルがターゲットのように2番目のクラスに属していることを意味します[0 1]

  • 最初のサンプル予測は[0.5 0.5]、これは私には少し混乱しているように見えるので、ラザニアは、どのクラスのメンバーでもないとして、各クラスで同じ確率を持つ最初のサンプルを予測すると思います

于 2016-03-27T05:25:00.583 に答える