up 0 down

Estoy tratando de traducir el siguiente DNN de alimentación hacia adelante

input_img = Input(shape=(1025, 70, 3 ) )
x = ( Flatten())(input_img)

for i in range(0,4):
   x = ( Dense(1024*3))(x)
   x = ( BatchNormalization() )(x)
   x = ( LeakyReLU())(x)
o0 = ( Dense(1025, activation='sigmoid'))(x)
o1 = ( Dense(1025, activation='sigmoid'))(x)
o2 = ( Dense(1025, activation='sigmoid'))(x)

en un RNN con tres capas LSTM y tres salidas o0, o1, o2, que se supone que es tres capas densas.

El tamaño de entrada RNN es (10,70,1025 * 3), (ligeramente cambiado para el feedforward DNN, pero mismos datos) al mismo tiempo que cada salida tiene un tamaño (10,70,1025)

He intentado crear las tres capas LSTM, con una red de sub-neuronal (aquí llamado subred), que utiliza la función TimeDistributed.

Debido a la dificultad en la ejecución de la función TimeDistributed, pensé que era una buena idea para obtener las tres capas de salida mediante el fraccionamiento de una capa densa de longitud, como se muestra a continuación:

def lambda_fun(y) :

    x = tf.split(y,[1025,1025,1025],-1)
    return x

input_img = Input(batch_shape=(10,70,3*1025 ) )
x = Bidirectional(LSTM(128,return_sequences=True, dropout=0.5, recurrent_dropout=0.2))(input_img)
x = Bidirectional(LSTM(128,return_sequences=True, dropout=0.5, recurrent_dropout=0.2))(x)
x = Bidirectional(LSTM(128,  return_sequences=True, dropout=0.5, recurrent_dropout=0.2))(x)

subnet = Sequential()
subnet.add(Dense(1025*3, activation='relu',input_shape=(x._keras_shape[-1],)))
subnet.add(BatchNormalization())
subnet.add(LeakyReLU())
y = TimeDistributed(subnet)(x)

o0, o1, o2 =  Lambda(lambda_fun )(y)

Mientras que la formación RNN funciona sin problemas, la función de costo desciende mucho más lento que el caso en que se utiliza un sencillo de alimentación hacia adelante, lo que me hace pensar que mi intento de implementación podría ser pobre. ¿Alguna sugerencia?