Voici trois visualisations de graphiques différentes utilisant des outils différents.
Afin de générer des exemples de visualisation, je vais utiliser un simple RNN pour effectuer une analyse des sentiments à partir d'une tutoriel en ligne :
class RNN(nn.Module):
def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim):
super().__init__()
self.embedding = nn.Embedding(input_dim, embedding_dim)
self.rnn = nn.RNN(embedding_dim, hidden_dim)
self.fc = nn.Linear(hidden_dim, output_dim)
def forward(self, text):
embedding = self.embedding(text)
output, hidden = self.rnn(embedding)
return self.fc(hidden.squeeze(0))
Voici le résultat si vous print()
le modèle.
RNN(
(embedding): Embedding(25002, 100)
(rnn): RNN(100, 256)
(fc): Linear(in_features=256, out_features=1, bias=True)
)
Vous trouverez ci-dessous les résultats de trois outils de visualisation différents.
Pour chacun d'entre eux, vous devez disposer d'une entrée fictive qui peut passer par la fonction d'entrée du modèle. forward()
méthode. Une façon simple d'obtenir cette entrée est de récupérer un lot à partir de votre Dataloader, comme ceci :
batch = next(iter(dataloader_train))
yhat = model(batch.text) # Give dummy batch to forward().
Torchviz
https://github.com/szagoruyko/pytorchviz
Je crois que cet outil génère son graphique en utilisant la passe arrière, donc toutes les boîtes utilisent les composants PyTorch pour la rétropropagation.
from torchviz import make_dot
make_dot(yhat, params=dict(list(model.named_parameters()))).render("rnn_torchviz", format="png")
Cet outil produit le fichier de sortie suivant :
C'est le seul résultat qui mentionne clairement les trois couches de mon modèle, embedding
, rnn
et fc
. Les noms des opérateurs sont tirés de la passe arrière, aussi certains d'entre eux sont-ils difficiles à comprendre.
HiddenLayer
https://github.com/waleedka/hiddenlayer
Cet outil utilise la passe avant, je crois.
import hiddenlayer as hl
transforms = [ hl.transforms.Prune('Constant') ] # Removes Constant nodes from graph.
graph = hl.build_graph(model, batch.text, transforms=transforms)
graph.theme = hl.graph.THEMES['blue'].copy()
graph.save('rnn_hiddenlayer', format='png')
Voici le résultat. J'aime la nuance de bleu.
Je trouve que la sortie a trop de détails et obscurcit mon architecture. Par exemple, pourquoi unsqueeze
mentionné tant de fois ?
Netron
https://github.com/lutzroeder/netron
Cet outil est une application de bureau pour Mac, Windows et Linux. Il repose sur le fait que le modèle a d'abord été exporté en Format ONNX . L'application lit ensuite le fichier ONNX et en effectue le rendu. Il est ensuite possible d'exporter le modèle vers un fichier image.
input_names = ['Sentence']
output_names = ['yhat']
torch.onnx.export(model, batch.text, 'rnn.onnx', input_names=input_names, output_names=output_names)
Voici à quoi ressemble le modèle dans l'application. Je pense que cet outil est assez astucieux : vous pouvez zoomer et faire des panoramiques, et vous pouvez explorer les couches et les opérateurs. Le seul point négatif que j'ai trouvé est qu'il ne fait que des mises en page verticales.