Я знаю, что в keras можно использовать Conv2DTranspose, который можно использовать в Image. Нам нужно использовать его в NLP, поэтому нужна деконволюция 1D.
Как мы реализуем Conv1DTranspose в keras?
Я знаю, что в keras можно использовать Conv2DTranspose, который можно использовать в Image. Нам нужно использовать его в NLP, поэтому нужна деконволюция 1D.
Как мы реализуем Conv1DTranspose в keras?
Используйте бэкэнд 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
В моем ответе, я полагаю, вы ранее использовали Conv1D для свертки.
Conv2DTranspose является новым в Keras2, он был тем, что он делал это с помощью комбинации UpSampling2D и уровня свертки. В StackExchange [Data Science] есть очень интересное обсуждение того, что является деконволюционными слоями (один ответ включает очень полезные анимированные gif).
Отметьте это обсуждение "Почему все свертки (без deconvolutions) в" Build 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 заключается в том, что вам нужно указать seq_length и не иметь ее как None (произвольная серия длин) К сожалению, то же самое можно сказать и о UpSampling1D для TensorFlow-back-end (Theano, похоже, снова здесь лучше - слишком плохо, что он не будет вокруг)
Вы можете изменить его, чтобы занять дополнительное измерение, запустить deconvolution и затем изменить его. На практике это работает. Но я действительно не думал очень сильно, если он имеет какие-либо теоретические последствия (но теоретически это также прекрасно, поскольку вы не собираетесь "свертывать" над этим измерением
x = Reshape( ( -1, 1 ) )( x )
x = Permute( ( 3, 1, 2 ) )( x )
x = Conv2DTranspose( filters, kernel )( x )
x = Lambda( K.squeeze, arguments={"axis":1} )( x )