2017-05-19 43 views
10

私は画像で使用できるケラでConv2DTransposeがあることを知っています。私たちはNLPでそれを使う必要があるので、1Dデコンボリューションが必要です。kerasでConv1DTransposeを実装する方法は?

どのようにケラで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

**評価:**回答は常に高く評価されますが、実際にコードがどのように問題を解決しているかについての情報を提供するのに役立ちます。誰もが正確なコーディングロジックに精通しているわけではありませんが、あなたの一般的なアプローチ*または*コンセプトを理解するかもしれません。あなたの答えを改善するために、いくつかの文脈を提供してください。(** https://meta.stackexchange.com/questions/114762)、[**偉大な答えを書く**] http://stackoverflow.com/help/how-to-answer)あなたの答えを数える方法に関するヒント –

1

、私はあなたが以前にコンボリューションのためConv1Dを使用しているとします。

Conv2DTransposeが新しいですKeras2では以前は何だったのでしょうか? UpSampling2Dと畳み込みレイヤの組み合わせによって行われました。 StackExchange [データサイエンス]には、what are deconvolutional layersに関する非常に興味深い議論があります(1つの答えには非常に便利なアニメーションGIFが含まれています)。

このディスカッションを確認してください"Why all convolutions (no deconvolutions) in "Building Autoencoders in Keras"興味深いです。 Francoisがすでに何回も説明してきたように、デコンボリューションレイヤーはアップサンプリングを伴う畳み込みレイヤーに過ぎません。公式のデコンボリューションレイヤーはないと思いますが、その結果は同じです。 (これについては、ほぼ同じではないかもしれません - それ以来、Keras 2はConv2DTransposeを導入しました)

私がそれを理解する方法は、UpSampling1DConvolution1Dの組み合わせです探していて、私は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を使用するための不便な部分は、あなたがseq_lengthを指定する必要があり、なし(任意の長さのシリーズ)としてそれを持つことができないということです (Theanoがあるように思わ残念ながら、同じことがTensorFlowバックエンドのためにUpSampling1Dと真であります

関連する問題