我正在阅读Convolutional Neural Networks tutorial。我希望在训练模型后可视化每层的输出。例如,在函数" evaluate_lenet5"我想将一个实例(它是一个图像)传递给网络,并查看每个图层的输出以及为输入训练神经网络的类。我认为在图像和每个图层的权重向量上做点积可能很容易,但它根本不起作用。
我有每个图层的对象:
# 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)
那么你可以建议一种在神经网络训练之后逐步可视化处理图像样本的方法吗?
答案 0 :(得分:6)
这不是那么难。
如果您使用theano深度学习教程中的 LeNetConvPoolLayer 的相同类定义,那么您只需编译一个函数,其中x
作为输入,[LayerObject].output
作为输出(其中 LayerObject 可以是任何层对象,如 layer0 , layer1 等,无论您想要想象哪一层。
vis_layer1 = function([x],[layer1.output])
传递一个(或许多)样本(确切地说,在训练时你输入张量的方式),你将获得为你的函数编译的特定层的输出。
注意:通过这种方式,您将获得模型在计算中使用的完全相同的形状的输出。但是,您可以通过重新整形输出变量layer1.output.flatten(n)
来重塑它。