En mi canalización computacional, he usado una función personalizada que va a crear bloques de keras personalizados, y usé estos bloques varias veces con Conv2D. Al final, obtuve dos tensor diferentes que presenta mapas con diferentes formas de tensor: TensorShape([None, 21, 21, 64]) y TensorShape([None, 10, 10, 192]). En este caso, usar tf.keras.layers.concatenate para hacer la concatenación no me funciona. ¿Alguien puede señalarme cómo concatenar estos dos tensores en uno? ¿Alguna idea para que esto suceda?

Si pudiera concatenar los tensores con forma de TensorShape([None, 21, 21, 64]) y TensorShape([None, 10, 10, 192]), quiero hacer lo siguiente después de la concatenación.

x = Conv2D(32, (2, 2), strides=(1,1), padding='same')(merged_tensors)
x = BatchNormalization(axis=-1)(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2,2))(x)
x = Flatten()(x)
x = Dense(256)(x)
x = BatchNormalization()(x)
x = Activation('relu')(x)
x = Dropout(0.25)(x)
x = Dropout(0.25)(x)
x = Dense(10)(x)
x = Activation('softmax')(x)
outputs = x

model = tf.keras.Model(inputs=inputs, outputs=outputs)

Intenté remodelar los tensores con la forma de TensorShape([None, 21, 21, 64]) y TensorShape([None, 10, 10, 192]) en convolución 1D y fusionarlos, luego remodelar la salida de nuevo a convolución 2d. Mi camino no funciona. ¿Alguien puede sugerir una posible forma de hacer esto? ¿Alguna idea?

actualización

Todavía no estoy seguro de que la forma de obtener la forma de salida de la concatenación sea TensorShape([None, 21+10, 21+10, 192+64]) o no porque no estoy seguro de que tenga sentido desde el punto de vista matemático. ¿Cómo hacer esta concatenación de forma fácil y correcta? ¿Cuál sería la forma correcta de uno concatenado? ¿Alguna idea?

2
Jared 26 ago. 2020 a las 23:41

1 respuesta

La mejor respuesta

Para operar una concatenación, debe proporcionar capas con las mismas formas excepto el eje concat ... en el caso de las imágenes, si desea concatenarlas en la dimensionalidad de las características (eje -1), las capas deben tener el mismo batch_dim, ancho y altura.

Si desea forzar la operación , debe hacer algo que iguale las dimensiones. Una posibilidad es el acolchado. A continuación, un ejemplo en el que concateno dos capas en la última dimensionalidad.

batch_dim = 32
x1 = np.random.uniform(0,1, (batch_dim, 10,10,192)).astype('float32')
x2 = np.random.uniform(0,1, (batch_dim, 21,21,64)).astype('float32')

merged_tensors = Concatenate()([ZeroPadding2D(((6,5),(6,5)))(x1), x2]) # (batch_dim, 21, 21, 192+64)

Con Pooling en lugar de Padding:

batch_dim = 32
x1 = np.random.uniform(0,1, (batch_dim, 10,10,192)).astype('float32')
x2 = np.random.uniform(0,1, (batch_dim, 21,21,64)).astype('float32')

merged_tensors = Concatenate()([MaxPool2D(2)(x2), x1]) # (batch_dim, 10, 10, 192+64)
2
Marco Cerliani 27 ago. 2020 a las 07:36