2017-05-19 27 views
10

Tôi biết có Conv2DTranspose trong keras có thể được sử dụng trong Image. Chúng ta cần sử dụng nó trong NLP, vì vậy cần phải giải mã 1D.Cách triển khai Conv1DTranspose trong keras?

Làm cách nào để chúng tôi triển khai Conv1DTranspose trong keras?

Trả lời

0

Bạn có thể định hình lại nó để chiếm một chiều không gian bổ sung, chạy giải mã và sau đó định hình lại nó. Trong thực tế, điều này hoạt động. Nhưng tôi đã không thực sự nghĩ rằng rất khó nếu nó có bất kỳ ý nghĩa lý thuyết (nhưng có vẻ như lý thuyết cũng được tốt như bạn sẽ không "dây leo" trên khía cạnh đó

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

Sử dụng keras backend để phù hợp với đầu vào tensor sang 2D transpose chập. không sử dụng thường transpose hoạt động cho nó sẽ tiêu thụ rất nhiều thời gian.

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

** Từ đánh giá **: Trong khi câu trả lời luôn được đánh giá cao, nó thực sự giúp cung cấp một số thông tin về cách mã của bạn giải quyết vấn đề trong tầm tay. Không phải ai cũng có thể quen thuộc với logic mã hóa chính xác của bạn, nhưng có thể hiểu cách tiếp cận chung * của bạn * hoặc * khái niệm *. Để giúp cải thiện câu trả lời của bạn, vui lòng cung cấp một số [** bối cảnh xung quanh nó **] (https://meta.stackexchange.com/questions/114762) và xem bài viết trợ giúp về [** viết câu trả lời tuyệt vời **] (http://stackoverflow.com/help/how-to-answer) để biết một số mẹo về cách làm cho câu trả lời của bạn được tính :) –

1

trong câu trả lời của tôi, tôi cho rằng trước đó bạn đang sử dụng Conv1D cho chập.

Conv2DTranspose là mới trong Keras2, nó từng là những gì nó được thực hiện bởi sự kết hợp của UpSampling2D và một lớp convolution. Trong StackExchange [Data Science] có một cuộc thảo luận rất thú vị về what are deconvolutional layers (một câu trả lời bao gồm các gif động rất hữu ích).

Kiểm tra cuộc thảo luận này về "Why all convolutions (no deconvolutions) in "Building Autoencoders in Keras" thú vị. Đây là một đoạn trích: "Như Francois đã giải thích nhiều lần rồi, một lớp deconvolution chỉ là một lớp hòa tan với một upsampling. Tôi không nghĩ rằng có một lớp deconvolution chính thức. Kết quả là như nhau." (Cuộc thảo luận tiếp diễn, có thể là chúng xấp xỉ, không chính xác như nhau - cũng vậy, kể từ đó, Keras 2 đã giới thiệu Conv2DTranspose)

Cách tôi hiểu nó, kết hợp UpSampling1D và sau đó là Convolution1D tìm kiếm, tôi thấy không có lý do để đi đến 2D.

Nếu tuy nhiên bạn muốn đi với Conv2DTranspose, trước tiên bạn sẽ cần định hình lại đầu vào từ 1D thành 2D, ví dụ:

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" 
    ) 
) 

Phần bất tiện cho việc sử dụng Conv2DTranspose là bạn cần phải xác định seq_length và không thể có nó là None (loạt dài tùy ý) Thật không may, điều này cũng đúng với UpSampling1D cho TensorFlow back-end (Theano có vẻ là

Các vấn đề liên quan