Utilice “Aplanar” o “Remodelar” para obtener una salida 1D de forma de entrada desconocida en keras

Quiero usar la capa keras Flatten() o Reshape((-1,)) al final de mi modelo para generar un vector 1D como [0,0,1,0,0, ... ,0,0,1,0] .

Lamentablemente hay un problema debido a mi forma de entrada desconocida que es:
input_shape=(4, None, 1))) .

Por lo general, la forma de entrada es algo entre [batch_size, 4, 64, 1] y [batch_size, 4, 256, 1] la salida debe ser batch_size x dimensión desconocida (para el primer ejemplo anterior: [batch_size, 64] y para la secound [batch_size, 256] ).

Mi modelo se parece a:

 model = Sequential() model.add(Convolution2D(32, (4, 32), padding='same', input_shape=(4, None, 1))) model.add(BatchNormalization()) model.add(LeakyReLU()) model.add(Convolution2D(1, (1, 2), strides=(4, 1), padding='same')) model.add(Activation('sigmoid')) # model.add(Reshape((-1,))) produces the error # int() argument must be a string, a bytes-like object or a number, not 'NoneType' model.compile(loss='binary_crossentropy', optimizer='adadelta') 

De modo que mi forma de salida actual es [batchsize, 1, dimensión desconocida, 1] . Lo que no me permite usar class_weights, por ejemplo, "ValueError: class_weight not supported for 3+ dimensional targets." .

¿Es posible usar algo como Flatten() o Reshape((1,)) para aplanar mi salida tridimensional en keras (2.0.4 con backend tensorflow) cuando uso una forma de entrada flexible?

¡Muchas gracias!

Puedes probar K.batch_flatten() envuelto en una capa Lambda . La forma de salida de K.batch_flatten() se determina dinámicamente en tiempo de ejecución.

 model.add(Lambda(lambda x: K.batch_flatten(x))) model.summary() _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_5 (Conv2D) (None, 4, None, 32) 4128 _________________________________________________________________ batch_normalization_3 (Batch (None, 4, None, 32) 128 _________________________________________________________________ leaky_re_lu_3 (LeakyReLU) (None, 4, None, 32) 0 _________________________________________________________________ conv2d_6 (Conv2D) (None, 1, None, 1) 65 _________________________________________________________________ activation_3 (Activation) (None, 1, None, 1) 0 _________________________________________________________________ lambda_5 (Lambda) (None, None) 0 ================================================================= Total params: 4,321 Trainable params: 4,257 Non-trainable params: 64 _________________________________________________________________ X = np.random.rand(32, 4, 256, 1) print(model.predict(X).shape) (32, 256) X = np.random.rand(32, 4, 64, 1) print(model.predict(X).shape) (32, 64)