La visualisation de la sortie de convolution de la couche dans tensorflow
J'essaye de visualiser la sortie d'une convolution de la couche dans tensorflow à l'aide de la fonction tf.image_summary
. Je suis déjà en train de l'utiliser avec succès dans d'autres instances (e. g. la visualisation de l'image d'entrée), mais certains ont des difficultés remodelage de la sortie ici correctement. J'ai le texte suivant conv couche:
img_size = 256
x_image = tf.reshape(x, [-1,img_size, img_size,1], "sketch_image")
W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
La sortie de h_conv1
aurait la forme [-1, img_size, img_size, 32]
. Juste à l'aide de tf.image_summary("first_conv", tf.reshape(h_conv1, [-1, img_size, img_size, 1]))
Ne tient pas compte de l'32 les différents noyaux, donc je suis fondamentalement de découpage à travers différentes fonctionnalités des cartes ici.
Comment puis-je les remodeler correctement? Ou est-il une autre fonction d'aide je pourrais utiliser, y compris pour cette sortie dans le résumé?
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas d'une fonction d'assistance, mais si vous voulez voir tous les filtres que vous pouvez les emballer dans une image avec un peu de fantaisie utilise de
tf.transpose
.Donc, si vous avez un tenseur qui est
images
xix
xiy
xchannels
Donc dans cet exemple
ix = 256
,iy=256
,channels=32
première tranche de 1 image, et de supprimer le
image
dimensionAjoutez ensuite un couple de pixels de zéro de remplissage autour de l'image
Puis remodeler, de sorte qu'au lieu de 32 canaux que vous avez 4x8 canaux, permet de les appeler
cy=4
etcx=8
.Maintenant la partie la plus délicate.
tf
semble renvoyer les résultats de C-commande, numpy par défaut.L'ordre actuel, si aplaties, de la liste de tous les canaux pour le premier pixel (une itération sur
cx
etcy
), avant de lister les canaux de la deuxième pixel (l'incrémentationix
). Aller à travers les lignes de pixels (ix
) avant l'incrémentation à la ligne suivante (iy
).Nous voulons l'ordre, qui jetterait les images dans une grille.
Si vous allez à travers une ligne d'une image (
ix
), avant de marcher le long de la ligne de canaux (cx
), lorsque vous atteignez la fin de la ligne de canaux étape à la ligne suivante dans l'image (iy
) et lors de l'exécution ou de lignes de l'image, vous incrément à la prochaine rangée de canaux (cy
). donc:Personnellement, je préfère
np.einsum
de fantaisie transpose, pour des raisons de lisibilité, mais il n'est pas danstf
encore.de toute façon, maintenant que les pixels sont dans le bon ordre, nous pouvons en toute sécurité l'aplatir en un 2d tenseur:
essayer
tf.image_summary
sur ce, vous devriez obtenir une grille de peu d'images.Ci-dessous est une image de ce que l'on obtient après avoir suivi toutes les étapes ici.
tf.image_summary
de sorte que vous aurez à remodelerV=tf.reshape(V,(1,4*256,8*256,1))
V = tf.image.resize_image_with_crop_or_pad(image, iy, ix)
de V comme premier argument la place de l'image? Je ne vois pas où l'image vient d'où?Au cas où quelqu'un voudrait faire "sauter" à numpy et de visualiser le "il" est ici un exemple sur la façon d'afficher à la fois
Weights
etprocessing result
. Toutes les transformations sont basés sur prev réponse parmdaoust
.vous pouvez essayer d'obtenir la convolution de la couche d'activation de l'image de cette façon:
cela devient une bande verticale avec toutes les images concaténé à la verticale.
si vous le souhaitez collier (dans mon cas de relu les activations de pad avec ligne blanche):
Personnellement, j'essaie à chaque tuile 2d-filtre dans une seule image.
Pour ce faire, -si je ne suis pas terriblement erronée depuis que je suis tout à fait nouveau pour DL- j'ai trouvé qu'il pourrait être utile d'exploiter les depth_to_space fonction, car il faut 4d tenseur
[batch, height, width, depth]
et produit une sortie de la forme
[batch, height*block_size, width*block_size, depth/(block_size*block_size)]
Où taille_bloc est le nombre de "tuiles" dans l'image de sortie. La seule limitation est que la profondeur doit être la place de taille_bloc, qui est un entier, sinon il ne peut pas "remplir" l'image correctement.
Une solution possible pourrait être de rembourrage de la profondeur de l'entrée du tenseur jusqu'à une profondeur qui est accepté par la méthode, mais je sill havn pas essayé ce.