J'ai formé un modèle de classification binaire avec CNN, et voici mon code
model = Sequential()
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],
border_mode='valid',
input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (16, 16, 32)
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters*2, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
# (8, 8, 64) = (2048)
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(2)) # define a binary classification problem
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adadelta',
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
nb_epoch=nb_epoch,
verbose=1,
validation_data=(x_test, y_test))
Et ici, je veux obtenir la sortie de chaque couche comme TensorFlow, comment puis-je faire cela?
la source
K.function([inp]+ [K.learning_phase()], [out])
signifie votre code?np.random.random(input_shape)[np.newaxis,...]
peut aussi s'écrirenp.random.random(input_shape)[np.newaxis,:]
K.function
ici , et prédire l'utilise dans la boucle de prédiction ici . Prédire les boucles sur la taille du lot (si elle n'est pas définie par défaut sur 32), mais c'est pour atténuer les contraintes sur la mémoire du GPU. Je ne sais donc pas pourquoi vous observezmodel.predict
est plus rapide.Depuis https://keras.io/getting-started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer
Un moyen simple consiste à créer un nouveau modèle qui produira les couches qui vous intéressent:
Vous pouvez également créer une fonction Keras qui retournera la sortie d'une certaine couche en fonction d'une certaine entrée, par exemple:
la source
layer_output = get_3rd_layer_output([X, 0])[0]
etlayer_output = get_3rd_layer_output([X, 1])[0]
Les documents mentionnent le mode train et le mode testSur la base de toutes les bonnes réponses de ce fil, j'ai écrit une bibliothèque pour récupérer la sortie de chaque couche. Il résume toute la complexité et a été conçu pour être le plus convivial possible:
https://github.com/philipperemy/keract
Il gère presque tous les cas de bord
J'espère que ça aide!
la source
La suite me semble très simple:
Au-dessus se trouve un objet tenseur, vous pouvez donc le modifier à l'aide d'opérations qui peuvent être appliquées à un objet tenseur.
Par exemple, pour obtenir la forme
model.layers[idx].output.get_shape()
idx
est l'indice du calque et vous pouvez le trouver à partir demodel.summary()
la source
J'ai écrit cette fonction pour moi-même (dans Jupyter) et elle a été inspirée par la réponse d' indraforyou . Il tracera automatiquement toutes les sorties de couche. Vos images doivent avoir une forme (x, y, 1) où 1 représente 1 canal. Vous appelez simplement plot_layer_outputs (...) pour tracer.
la source
De: https://github.com/philipperemy/keras-visualize-activations/blob/master/read_activations.py
la source
Je voulais ajouter ceci en tant que commentaire (mais je n'ai pas assez de rep.) À la réponse de @ indraforyou pour corriger le problème mentionné dans le commentaire de @ mathtick. Pour éviter l'
InvalidArgumentError: input_X:Y is both fed and fetched.
exception, remplacez simplement la ligneoutputs = [layer.output for layer in model.layers]
paroutputs = [layer.output for layer in model.layers][1:]
, ieadapter l'exemple de travail minimal d'indraforyou:
ps mes tentatives d'essayer des choses telles que
outputs = [layer.output for layer in model.layers[1:]]
ne fonctionnaient pas.la source
keras
modèle). Votre calque d'intégration de mots est équivalent au calque d'entrée dans l'exemple fourni ici.En supposant que vous ayez:
1- Keras pré-formé
model
.2- Saisie
x
comme image ou ensemble d'images. La résolution de l'image doit être compatible avec la dimension de la couche d'entrée. Par exemple 80 * 80 * 3 pour une image à 3 canaux (RVB).3- Le nom de la sortie
layer
pour obtenir l'activation. Par exemple, le calque "flatten_2". Cela devrait être inclus dans lalayer_names
variable, représente le nom des couches de la donnéemodel
.4-
batch_size
est un argument optionnel.Ensuite, vous pouvez facilement utiliser la
get_activation
fonction pour obtenir l'activation de la sortielayer
pour une entrée donnéex
et pré-entraînéemodel
:la source
Dans le cas où vous avez l'un des cas suivants:
InvalidArgumentError: input_X:Y is both fed and fetched
Vous devez effectuer les modifications suivantes:
outputs
variablefunctors
boucleExemple minimum:
la source
[x1, x2, xn, 1]
? Mon x1 n'est pas défini et j'aimerais comprendre ce que vous y définissez.x1
etx2
sont les entrées du modèle. Comme indiqué, au cas où vous auriez 2 entrées sur votre modèle.Eh bien, d'autres réponses sont très complètes, mais il existe un moyen très basique de "voir", et non de "récupérer" les formes.
Faites simplement un
model.summary()
. Il imprimera tous les calques et leurs formes de sortie. Les valeurs "Aucune" indiqueront des dimensions variables, et la première dimension sera la taille du lot.la source