2016-05-07 2 views
1

私はBlocks(とTheano)で本当に単純なリカレントニューラルネットワークを設計しました。コスト関数として、私は平方誤差関数を使用することに決めました。これは単に(y-y')^2と定義されています。私はミニバッチ全体の平均コストを計算したいと思います。Block(Theano、Python)でSquaredError brickを使用するには?

次のコードは、ブロッククラス/メソッドSquaredErrorを使用したほとんどの動作例です。これは、私が関係する限り、正確に目的の操作を行うことになっています。

float64を無効にして無視してください。evalの実行を簡略化するために使用しています。問題は、32bを使用しても維持されます。

import theano.tensor as tt 
from blocks.bricks.cost import SquaredError 

if __name__ == '__main__': 
    a = tt.vector('a', dtype='float64') 
    b = tt.vector('b', dtype='float64') 

    cost = SquaredError().apply(a, b) 

    print(cost.eval({a: [1.0, 2.0, 3.0, 4.0], 
        b: [0.5, 2.1, 3.4, 3.8]})) 

    # Expected: mean(0.5^2 + 0.1^2 + 0.4^2 + 0.2^2) 
    # Got: ValueError: Not enough dimensions on squarederror_cost_matrix_output_0 to reduce on axis 1 

問題のある行を下の行に変更すると、すべて正常に動作します。

cost = tt.sqr(tt.abs_(a - b)).mean() 

私は間違っていますか?私はブロックをもっと学ぼうとしていますが、これは私の理解を超えています。別のレンガを使うはずですか?あるいは、何らかの形でテンソルを前処理しますか?

答えて

1

コストマットブリックの2D入力が必要なように見えますが、これはまあまあです。私はそれについてan issueを提出しました。あなたは、(N、1)個までの行列をあなたの入力をdimshufflingすることでこれを回避することができますが、VariableFilter演算などの入力と出力の自動タグ付けを使用している場合にのみ、あなたがTheanoの式でやったようにコストを削減することもできます(しかし、あなたはabsを必要としませんが、負の数の正方形は常に正です)。

+0

P.S.ブロックはStackOverflowを積極的に監視するのに十分なほど普及していませんが、ブロックユーザーのGoogleグループで一般的なオープンエンドの使用に関する質問や、問題が明らかに壊れている場合は問題追跡ツールを試すことができます。 – dwf

+0

ご説明いただきありがとうございます。次回はSOの代わりにユーザーグループを使用します。 – petrbel

関連する問題