2017-05-19 3 views
10

Image에서 사용할 수있는 keras에 Conv2DTranspose가 있다는 것을 알고 있습니다. 우리는 이것을 NLP에서 사용해야하므로 1D 역 합성이 필요합니다.keras에 Conv1DTranspose를 구현하는 방법?

어떻게 keras에 Conv1DTranspose를 구현합니까?

답변

0

여분의 디멘션을 차지하도록 재구성 할 수 있으며, 디콘 볼 루션을 실행 한 다음 다시 모양을 바꿀 수 있습니다. 실제로이 방법이 효과적입니다. 하지만 난 정말 어떤 이론적 인 의미를 가지고있는 경우 아주 열심히 생각 적이 없다 (그러나 당신이 입력에 맞게

x = Reshape((-1, 1))(x) 
x = Permute((3, 1, 2))(x) 
x = Conv2DTranspose(filters, kernel)(x) 
x = Lambda(K.squeeze, arguments={"axis":1})(x) 
1

사용 keras 백엔드 해당 차원 이상을 "말다"로 이동하지 않는 한 이론적으로도 괜찮을 것 같다 텐서가 회선을 트랜스 2D 할 수 있습니다. 그것은 많은 시간을 소비 할 항상 작업을 바꾸어 사용하지 마십시오. 내 대답에

import keras.backend as K 
from keras.layers import Conv2DTranspose 


def Conv1DTranspose(input_tensor, filters, kernel_size, strides=2, padding='same'): 
    x = Lambda(lambda x: K.expand_dims(x, axis=2))(input_tensor) 
    x = Conv2DTranspose(filters=filters, kernel_size=(kernel_size, 1), strides=(strides, 1), padding=padding)(x) 
    x = Lambda(lambda x: K.squeeze(x, axis=2))(x) 
    return x 
+1

** 답 : ** 답변 : 항상 감사하지만, 실제로 코드가 문제의 해결 방법에 대한 정보를 제공하는 데 실제로 도움이됩니다. 모든 사람이 정확한 코딩 논리에 익숙하지 않을 수도 있지만 일반적인 접근 방식이나 개념 *을 이해할 수 있습니다. 답변을 개선하는 데 도움이되도록 [** context it ** **] (https://meta.stackexchange.com/questions/114762)를 제공하고 [** writing great answer **]에 대한 도움말을 참조하십시오 http://stackoverflow.com/help/how-to-answer) 답변을 세는 방법에 대한 몇 가지 팁은 :) –

1

을, 당신이 이전에 회선에 대한 Conv1D를 사용하는 가정합니다.

Conv2DTranspose가 새 Keras2에서는 이전에는 UpSampling2D와 convolution layer의 조합에 의해 수행되었습니다. StackExchange [데이터 과학]에는 what are deconvolutional layers에 대한 매우 흥미로운 토론이 있습니다 (하나의 대답에는 매우 유용한 애니메이션 GIF가 포함되어 있습니다).

이 질문을 환영합니다. "Why all convolutions (no deconvolutions) in "Building Autoencoders in Keras"이 흥미 롭습니다. "프랑소와가 이미 여러 번 설명했듯이 데콘 볼 루션 레이어는 업 샘플링이있는 회선 레이어 일뿐 공식적인 데콘 볼 루션 레이어는 없다고 생각합니다. 결과도 같습니다." (토론은 계속되고, 정확히 동일하지는 않습니다 - 그 이후로 Keras 2는 Conv2DTranspose를 도입했습니다)

나는 그것을 이해하기 때문에 UpSampling1D과 그 다음으로는 Convolution1D이 무엇인지 알고 있습니다. 찾고, 나는 2D로 갈 이유가 없다.

그러나 Conv2DTranspose로 이동하려면 먼저 입력을 1D에서 2D로 변경해야합니다. 예 :

model = Sequential() 
model.add(
    Conv1D(
     filters = 3, 
     kernel_size = kernel_size, 
     input_shape=(seq_length, M),#When using this layer as the first layer in a model, provide an input_shape argument 
    ) 
) 
model.add(
    Reshape((-1, 1, M)) 
) 
model.add(
    keras.layers.Conv2DTranspose(
     filters=M, 
     kernel_size=(10,1), 
     data_format="channels_last" 
    ) 
) 

Conv2DTranspose를 사용하는 불편한 부분은 Theano이 될 것으로 보인다 (동일 TensorFlow 백엔드에 대한 UpSampling1D와 사실, seq_length을 지정해야 불행히도 없음 (임의의 길이 시리즈)로 그것을 가질 수 있다는 것입니다