2017-02-10 3 views
1

J'ai une entrée 2D (ou 3D si l'on considère le nombre d'échantillons) et je veux appliquer une couche keras qui prendrait cette entrée et sortirait une autre matrice 2D. Ainsi, par exemple, si j'ai une entrée avec une taille (ExV), la matrice de poids d'apprentissage serait (SxE) et la sortie (SxV). Est-ce que je peux faire ceci avec la couche Dense? (Demande Nassim)Keras Custom Layer entrée 2D -> sortie 2D

EDIT:

La première couche ne fait rien. C'est juste pour donner une entrée à la couche Lambda:

from keras.models import Sequential 
from keras.layers.core import Reshape,Lambda 
from keras import backend as K 
from keras.models import Model 

input_sample = [ 
[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]] 
,[[21,22,23,24,25],[26,27,28,29,30],[31,32,33,34,35],[36,37,38,39,40]] 
,[[41,42,43,44,45],[46,47,48,49,50],[51,52,53,54,55],[56,57,58,59,60]] 
] 


model = Sequential() 
model.add(Reshape((4,5), input_shape=(4,5))) 
model.add(Lambda(lambda x: K.transpose(x))) 
intermediate_layer_model = Model(input=model.input,output=model.layers[0].output) 
print "First layer:" 
print intermediate_layer_model.predict(input_sample) 
print "" 
print "Second layer:" 
intermediate_layer_model = Model(input=model.input,output=model.layers[1].output) 
print intermediate_layer_model.predict(input_sample) 

Répondre

1

Cela dépend de ce que vous voulez faire. Est-ce 2D parce que c'est une séquence? Alors LSTM est fait pour cela et renverra une séquence si la taille désirée si vous définissez return_sequence = True. Les CNN peuvent également fonctionner sur des entrées 2D et générer quelque chose de taille variable en fonction du nombre de noyaux que vous utilisez.

Sinon, vous pouvez remodeler à un (E x V,) tenseur 1D, utiliser une couche dense de dimension SxV et remodeler la sortie à un (S, V) tenseur 2D ...

Je ne peux pas vous aider plus, nous avons besoin de connaître votre cas de figure :-) il y a trop de possibilités avec les réseaux de neurones.

EDIT:

Vous pouvez utiliser TimeDistributed (Dense (S)). Si votre entrée a une forme (E, V), vous remodelez à (V, E) pour avoir V comme "dimension temporelle". Ensuite, vous appliquez TimeDistributed (Dense (S)) qui sera un calque dense avec des poids (ExS), la sortie aura la forme (V, S) de sorte que vous pouvez le remodeler en (S, V).

Est-ce que cela fait ce que vous voulez? La couche TimeDistributed() appliquera la même couche Dense (S) à chaque ligne V de votre entrée avec des poids partagés.

EDIT 2:

Après avoir regardé le code de backend keras, il se avère que d'utiliser la Transposer tensorflow avec l'option 'modèles de permutation de disponibles, vous devez utiliser K.permute_dimensions (x, modèle). La dimension du lot doit être incluse. Dans votre cas:

Lambda(lambda x: K.permute_dimensions(x,[0,2,1])) 

K.transpose (x) utilise la même fonction interne (pour back-end tf) mais permutations est réglé sur la valeur par défaut qui est [n, n-1, ..., 0] .

+0

Salut, merci pour la réponse. N'est pas une séquence, et ne peut donc pas utiliser LSTM. J'ai aussi pensé à CNN, mais ensuite il n'apprend pas de matrice de poids (SxE), car il partagera les poids. La possibilité de remodeler ne fonctionne pas non plus, car c'est le contraire, c'est-à-dire que tous les poids seront appliqués simultanément pour chaque neurone. – Miguel

+0

Édité avec une autre proposition :) –

+0

Est-ce que c'est ce que vous cherchiez? –