“ Deep Learning很吸引人,也很玄乎的一个点就是大家都说它可以提取到分级的逐层抽象的特征。但对我们来说,总是耳听为虚,眼见为实。所以,每当我们训练完一个深度模型后,我们还特别想把这个深度模型学到的东西给可视化出来,好弄明白它到底学到了什么东西,是不是有意义的,是不是像传说中的那样神奇” zouxy09 http://blog.csdn.net/zouxy09/article/details/10012747
于是在训练完自己的数据之后,也来看看 每一层的参数 及 输出 是否有明显的可视化效果。
由于系统里 无法show的问题,我改成了将结果存成图片,然后从服务器上拉到本地来看。对应的函数做了一点小的修改。
def vis_square(data, padsize=1, padval=0):
data -= data.min()
data /= data.max()
# force the number of filters to be square
n = int(np.ceil(np.sqrt(data.shape[0])))
padding = ((0, n ** 2 - data.shape[0]), (0, padsize), (0, padsize)) + ((0, 0),) * (data.ndim - 3)
data = np.pad(data, padding, mode='constant', constant_values=(padval, padval))
# tile the filters into an image
data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))
data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])
#pylab.imshow(data)
#pylab.show()
plt.figure()
plt.imshow(data)
plt.savefig("t.jpg")
原图 缩放到32*32后如下
输出代码如下 :
觉得输出结果还是有明显的可视性。
feat = net.blobs['conv1'].data[0]
vis_square(feat, padval=1)
filters = net.params['conv1'][0].data
vis_square(filters.transpose(0,2,3,1))
feat = net.blobs['conv2'].data[0]
vis_square(feat, padval=1)
filters = net.params['conv2'][0].data
vis_square(filters[:32].reshape(32**2, 5, 5))
feat = net.blobs['conv3'].data[0]
vis_square(feat, padval=0.5)
feat = net.params['conv3'][0].data
vis_square(filters[:32].reshape(32**2,5,5))
feat = net.blobs['ip1'].data[0]
vis_square(feat)
feat = net.blobs['ip2'].data[0]
vis_square(feat)