2017-04-14 6 views
0

내가 할 일이있는 코드가 있는데, 예상했던 것보다 다르게 동작합니다.Keras에서 시퀀스 (숨겨진 레이어)를 왼쪽으로 이동하는 방법은 무엇입니까?

깊은 학습 모델의 일부로 벡터 (숨겨진 레이어) 시퀀스를 왼쪽으로 한 단계 씩 이동하는 (훈련 불가능한) 레이어가 필요합니다. 내 프레임 워크는 Theano 백엔드가있는 Keras2입니다. 레이어에 입력이 3 시간 단계의 순서 인 경우

함께 (두 숨겨진 요소

다음 층의 출력은 좌측으로 이동한다

으로, 최소 예를 제공한다 제로 패딩) :

1 차원 컨벌루션이 작업을 수행 할 것이라고 생각했습니다. 여기에서 적절한 가중치를 지정했습니다. 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

이 작전은 "회선"라고하지만 필터가 필터를 반전없이 입력 창과 결합되어 있기 때문에, 그들은 엄격하게 "상호 상관을"말하는 것을 참고. 자세한 내용은 상호 상관 특성을 참조하십시오.