2017-04-14 21 views
0

我有一些代碼似乎做了這項工作,但它的行爲與我預期的不同。如何在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))]) 

這似乎不合邏輯,我(我希望它會向右移動,而不是向左)。 我的邏輯在哪裏破解?

回答

0

看來你已經解決了這個問題,但我同意左右混淆。我認爲它可以歸結爲低層次的實現選擇,是否反轉卷積核心。從Tensorflow文檔:https://www.tensorflow.org/versions/r0.11/api_docs/python/nn/convolution

注意的是,雖然這些老年退休金計劃被稱爲「迴旋」,他們嚴格來說是「互相關」由於過濾器與無反轉濾波器的輸入窗口相結合。有關詳細信息,請參閱互相關的屬性。