我有一些代碼似乎做了這項工作,但它的行爲與我預期的不同。如何在Keras中將序列(隱藏層)向左移動?
我想要一個(不可訓練的)圖層作爲我的深度學習模型的一部分,它將向量(隱藏層)的序列向左移動一步。我的框架是帶有Theano後端的Keras2。
爲了提供最小的例如,如果輸入到該層是一個3時間步序列,用兩個隱藏部件
然後該層的輸出應該向左側偏移(與零填充):
[[2, 3],
[4, 5],
[0, 0]]
我認爲一維卷積可以完成這項工作,我在那裏指定了合適的權重。隨着3卷積大小,我只想設置爲左,中間位置內核權爲0,並有正確的位置對角線的權重(只複製第1和第2維):
[[[ 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))])
這似乎不合邏輯,我(我希望它會向右移動,而不是向左)。 我的邏輯在哪裏破解?