5

Ich lese Convolutional Neural Networks tutorial. Ich möchte die Ausgabe jeder Schicht visualisieren, nachdem das Modell trainiert wurde. Zum Beispiel möchte ich in der Funktion "evaluate_lenet5" eine Instanz (die ein Bild ist) an das Netzwerk übergeben und die Ausgabe jedes Layers sowie die Klasse, die das Neural Network für die Eingabe trainiert hat, sehen. Ich dachte, dass es einfach sein könnte, ein Punktprodukt auf einem Bild und einem Gewichtvektor jeder Schicht zu machen, aber es hat überhaupt nicht funktioniert.Visualisierung der Ausgabe von jeder Schicht in der convolutional MLP

Ich habe Objekte jeder Schicht als:

# Reshape matrix of rasterized images of shape (batch_size, 28 * 28) 
# to a 4D tensor, compatible with our LeNetConvPoolLayer 
# (28, 28) is the size of MNIST images. 
layer0_input = x.reshape((batch_size, 1, 28, 28)) 

# Construct the first convolutional pooling layer: 
# filtering reduces the image size to (28-5+1 , 28-5+1) = (24, 24) 
# maxpooling reduces this further to (24/2, 24/2) = (12, 12) 
# 4D output tensor is thus of shape (batch_size, nkerns[0], 12, 12) 
layer0 = LeNetConvPoolLayer(
    rng, 
    input=layer0_input, 
    image_shape=(batch_size, 1, 28, 28), 
    filter_shape=(nkerns[0], 1, 5, 5), 
    poolsize=(2, 2) 
) 

# Construct the second convolutional pooling layer 
# filtering reduces the image size to (12-5+1, 12-5+1) = (8, 8) 
# maxpooling reduces this further to (8/2, 8/2) = (4, 4) 
# 4D output tensor is thus of shape (batch_size, nkerns[1], 4, 4) 
layer1 = LeNetConvPoolLayer(
    rng, 
    input=layer0.output, 
    image_shape=(batch_size, nkerns[0], 12, 12), 
    filter_shape=(nkerns[1], nkerns[0], 5, 5), 
    poolsize=(2, 2) 
) 

# the HiddenLayer being fully-connected, it operates on 2D matrices of 
# shape (batch_size, num_pixels) (i.e matrix of rasterized images). 
# This will generate a matrix of shape (batch_size, nkerns[1] * 4 * 4), 
# or (500, 50 * 4 * 4) = (500, 800) with the default values. 
layer2_input = layer1.output.flatten(2) 

# construct a fully-connected sigmoidal layer 
layer2 = HiddenLayer(
    rng, 
    input=layer2_input, 
    n_in=nkerns[1] * 4 * 4, 
    n_out=500, 
    activation=T.tanh 
) 

# classify the values of the fully-connected sigmoidal layer 
layer3 = LogisticRegression(input=layer2.output, n_in=500, n_out=10) 

So können Sie einen Weg vorschlagen, eine Probe zum Verarbeiten eines Bildes Schritt für Schritt, nachdem das neuronale Netz trainiert wird sichtbar zu machen?

Antwort

6

Das ist nicht so schwer. Wenn Sie die gleiche Klassendefinition von LeNetConvPoolLayer verwenden aus dem Theano tief-Learning-Tutorial, dann brauchen Sie nur eine Funktion mit x als Eingabe und [LayerObject].output als Ausgabe zu erstellen (wobei LayerObject jede Schicht Objekt wie Layer0 sein kann, layer1 usw. je nachdem, welche Ebene, die Sie visualisieren möchten.

vis_layer1 = function ([x], [layer1.output])

Übergeben Sie eine (oder viele) Stichprobe (genau wie Sie den Inputtensor während des Trainings gefüttert haben) und Sie erhalten die Ausgabe der bestimmten Ebene, für die Ihre Funktion kompiliert wurde.

Hinweis: Auf diese Weise werden Sie die Ausgaben in der exakt gleichen Form erhalten das Modell bei der Berechnung verwendet hat. Sie können jedoch umformen es wie Sie möchten, indem Sie die Ausgangsvariable wie layer1.output.flatten(n) umformen.