example dense convolution2d conv2d conv1d conv1 conv keras keras-layer

dense - keras model convolution2d



¿Cómo implementar el Conv1DTranspose en keras? (3)

Sé que hay un Conv2DTranspose en keras que se puede usar en Image. Necesitamos usarlo en PNL, por lo que se necesita la desconvolución 1D.

¿Cómo implementamos el Conv1DTranspose en keras?


En mi respuesta, supongo que anteriormente está utilizando Conv1D para la convolución.

Conv2DTranspose es nuevo en Keras2, solía ser que lo que hacía se hacía mediante una combinación de UpSampling2D y una capa de convolución. En StackExchange [Data Science] hay una discusión muy interesante sobre qué son las capas deconvolucionales (una respuesta incluye gifs animados muy útiles).

Consulte esta discusión sobre "¿Por qué todas las circunvoluciones (no deconvoluciones) en" Building Autoencoders in Keras "es interesante? Aquí hay un extracto:" Como Francois ya ha explicado varias veces, una capa de deconvolución es solo una capa de convolución con un muestreo ascendente. No creo que haya una capa oficial de deconvolución. El resultado es el mismo ". (La discusión continúa, podría ser que son aproximadamente, no exactamente iguales; también, desde entonces, Keras 2 introdujo Conv2DTranspose)

De la forma en que lo entiendo, una combinación de UpSampling1D y luego Convolution1D es lo que está buscando, no veo ninguna razón para ir a 2D.

Sin embargo, si desea utilizar Conv2DTranspose, primero deberá reformular la entrada de 1D a 2D, por ejemplo.

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

La parte inconveniente de usar Conv2DTranspose es que necesita especificar seq_length y no puede tenerlo como Ninguno (series de longitud arbitraria). no voy a estar alrededor


Puede reformularlo para que ocupe una dimensión adicional, ejecute la deconvolución y luego vuelva a configurarlo. En la práctica, esto funciona. Pero realmente no he pensado mucho si tiene alguna implicación teórica (pero parece que teóricamente también está bien, ya que no vas a "convulsionar" sobre esa dimensión

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


Use el backend keras para ajustar el tensor de entrada a la convolución de transposición 2D. No siempre use la operación de transposición ya que consumirá mucho tiempo.

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