Как реализовать Conv1DTranspose в keras?

Я знаю, что в keras есть Conv2DTranspose, который можно использовать в Image. Нам нужно использовать его в НЛП, поэтому необходима одномерная деконволюция.

Как реализовать Conv1DTranspose в keras?


person Huo    schedule 19.05.2017    source источник


Ответы (4)


Используйте серверную часть keras, чтобы подогнать входной тензор к 2D-свертке транспонирования. Не всегда используйте операцию транспонирования, так как это займет много времени.

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


def Conv1DTranspose(input_tensor, filters, kernel_size, strides=2, padding='same'):
    """
        input_tensor: tensor, with the shape (batch_size, time_steps, dims)
        filters: int, output dimension, i.e. the output tensor will have the shape of (batch_size, time_steps, filters)
        kernel_size: int, size of the convolution kernel
        strides: int, convolution step size
        padding: 'same' | 'valid'
    """
    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
person Dingkun Liu    schedule 21.08.2017
comment
Из обзора. Хотя ответы всегда приветствуются, они действительно помогают предоставить некоторую информацию о том, как ваш код решает проблему. Не все могут быть знакомы с вашей точной логикой кодирования, но могут понять ваш общий подход или концепцию. Чтобы помочь улучшить свой ответ, предоставьте некоторый контекст, окружающий его, и см. справочную статью на написание отличных ответов для некоторых советов о том, как сделать так, чтобы ваши ответы учитывались :) - person Obsidian Age; 21.08.2017
comment
@ObsidianAge Я согласен. Думаю, это хороший ответ... но могу ли я доверять ему без объяснений? - person rjurney; 09.08.2019
comment
Привет, что должно быть входным тензором и как определяется лямбда-функция ?? - person Nadjib Bendaoud; 08.01.2020

В моем ответе я предполагаю, что вы ранее использовали Conv1D для свертки.

Conv2DTranspose является новым в Keras2, раньше то, что он делает, выполнялось комбинацией UpSampling2D и слоя свертки. В StackExchange[Data Science] есть очень интересное обсуждение что такое слои деконволюции ( один ответ включает в себя очень полезные анимированные GIF-файлы).

Проверьте это обсуждение о "Почему все свертки (без деконволюций) в "Создание автоэнкодеров в 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 (серия произвольной длины). рядом не будет)

person ntg    schedule 17.10.2017
comment
Вы должны проверить проблему, о которой вы упомянули, еще раз. Люди объяснили разницу между деконволюцией и сверткой плюс повышающая дискретизация. - person Dingkun Liu; 01.06.2021

В TensorFlow v2.2.0 слой Conv1DTranspose реализован в API tf.keras.layers. Проверьте!

person Matt Ellis    schedule 20.05.2020

Вы можете изменить его форму, чтобы занять дополнительное измерение, запустить деконволюцию, а затем изменить форму обратно. На практике это работает. Но я на самом деле не особо задумывался, имеет ли это какие-либо теоретические последствия (но, кажется, теоретически это также хорошо, поскольку вы не собираетесь «сворачиваться» над этим измерением

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