私は仕事をしていると思われるコードをいくつか持っていますが、それは私が期待していたものとは異なる動作をしています。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))])
を使用する必要があります。 私のロジックの亀裂はどこですか?