2017-04-14 6 views
0

私は仕事をしていると思われるコードをいくつか持っていますが、それは私が期待していたものとは異なる動作をしています。Kerasのシーケンス(隠れたレイヤー)を左にシフトする方法は?

私は深い学習モデルの一部として、(訓練されていない)レイヤーを持っていて、ベクトルのシーケンス(隠れたレイヤー)を一歩左にシフトしたいと思っています。私のフレームワークは、Theanoのバックエンドを持つKeras2です。最小の例を提供する

層への入力は2つの隠しコンポーネント

で、3時間ステップのシーケンスである場合、層の出力を用いて(左にシフトされなければなりませんゼロ詰め):

[[2, 3], 
[4, 5], 
[0, 0]] 

私は1次元畳み込みが仕事をすると考えました。ここで私は適切にウェイトを指定しました。 3のコンボリューション大きさで、私はちょうど0に左と中央の位置のためのカーネルの重みを設定し、右の位置(単にコピーする第一および第二次元)の対角の重みを持っているでしょう:

[[[ 0., 0.], 
    [ 0., 0.]], 
[[ 0., 0.], 
    [ 0., 0.]], 
[[ 1., 0.], 
    [ 0., 1.]]] 

ただし、私はこれを好きです、ベクトルは左にではなく右にシフトします。完全に動作する例:

import keras 
import numpy as np 

dim, length = 2,3 
input_mat = np.arange(dim*length).reshape(1,length,dim) 
inp = keras.layers.Input(shape=(length,dim)) 

shift_left_kernel = np.asarray([np.zeros((dim,dim)),np.zeros((dim,dim)), np.eye(dim)]) 
outp = keras.layers.Convolution1D(dim, length, padding='same', kernel_initializer='zeros', use_bias=False, trainable=False, weights=[shift_left_kernel])(inp) 

model_network = keras.models.Model(inputs=inp, outputs=outp) 
print(model_network.predict([input_mat])) 
#[[[ 0. 0.] 
# [ 0. 1.] 
# [ 2. 3.]]] 

は代わりに、私は(私はそれがない左に、右にシフトするだろうと期待して)私には非論理的なようだ

shift_left_kernel = np.asarray([np.eye(dim), np.zeros((dim,dim)),np.zeros((dim,dim))]) 

を使用する必要があります。 私のロジックの亀裂はどこですか?

答えて

0

あなたはすでにこれを解決しているようですが、右左が混乱していると私は同意します。畳み込みカーネルを逆転させるかどうかは、低レベルの実装の選択肢になると思います。 Tensorflowのドキュメントから:https://www.tensorflow.org/versions/r0.11/api_docs/python/nn/convolution

これらOPSは「畳み込み」と呼ばれているが、フィルタは、フィルタを反転させることなく、入力ウィンドウと組み合わされているので、彼らは厳密には「相互相関」を話していることに注意してください。詳細は、相互相関のプロパティを参照してください。

関連する問題