0

J'ai une couche Conv2D produisant un tenseur de forme (batch_size, 600, 105, 8). Ceci est un lot de spectrogrammes de chanson avec un feature_map de 8. Maintenant, je veux appliquer un "Dense" couche de taille 48 à chaque trame de temps (600) pour produire un tenseur de forme (batch_size, 600, 48). Le calque Keras Dense par défaut ne semble pas le couper ...Comment appliquer une couche dense TimeDistributed à un tenseur de forme (batch_size, 600, 105, 8) pour produire une sortie (batch_size, 600, 48)

Des suggestions?

C'est ma fonction

def build_cnn(input_shape=(None, None, 1), 
      feature_map_size=8, 
      num_layers=5, 
      kernerl_size=(5, 5), 
      dropout=0.2, 
      pool_size=(2, 2), 
      epochs=100, 
      lr=0.001, 
      momentum=0.9, 
      verbose=False): 

    model = Sequential() 

    # Add the convolutional layers 
    for _ in range(num_layers):  
     # Conv layer 
     model.add(Conv2D(
      feature_map_size, 
      kernerl_size, 
      input_shape=input_shape, 
      padding='same', 
      activation='elu') 
     ) 
     # Dropout layer 
     # model.add(Dropout(dropout)) 

    # Dense layer 
    model.add(TimeDistributed(Dense(48, activation='elu'))) 
+0

Si le cadre de temps est 600, qu'est-ce que 105? –

+0

@ DanielMöller Nombre de bacs dans un Magnitude Mel échelle spectrogramme –

Répondre

0

La façon la plus simple et insensible de le faire, remodèle les données:

#after the convolutions: 

model.add(Reshape((600,105*8))) 
model.add(Dense(48,...)) 

Mais ce ne peut pas être le meilleur choix. Malheureusement, je ne comprends pas très bien ces spectogrammes, alors suggérez d'autres approches. Mais celui-ci jette fondamentalement tous les bins et toutes les fonctionnalités dans un calque Dense, et ils seront mélangés ensemble.


Dans le cas avec -1 échoue remodelant

Il est possible de traiter avec des formes inconnues à l'intérieur des couches lambda avec des fonctions de back-end. Mais cela ne fonctionne qu'avec tensorflow comme backend. Theano n'aime pas l'idée. J'ai abandonné Theano à cause de ça.

#valid in tensorflow only 
import keras.backend as K 

def reshape(x): 
    shp = K.shape(x) 
    shp = K.concatenate([shp[:2],shp[2:3]*shp[3:]]) 
    return K.reshape(x,shp) 

model.add(Lambda(reshape)) 
+0

Si la première dimension logarithmiquement comprimé (600) est variable, je peux dire #after les circonvolutions: 'model.add (Reshape ((- 8 * 1.105))) '? –

+0

Hmm, pas sûr, en interne, il y aura deux valeurs '-1' (une pour la dimension du lot et l'autre en entrée). Vous pouvez l'essayer, mais au cas où cela ne fonctionnerait pas, il y a une possibilité que je vais mettre dans ma réponse. –

+0

Mise à jour de la réponse. –