caffe在进行图像训练时,对特征或中间结果进行可视化,可以帮助更好的对训练过程和图像的理解。
caffe中的可视化,另一种是把网络中间的某层,做卷积的相反动作,用于把某层还原成原来的图像。卷积和反卷积时,使用的参数是共享的,都是卷积时学习到的参数。如下:
#加载网络和逆向网络
net = caffe.Net('deploy.prototxt',
'model.caffemodel',
caffe.TEST)
invnet = caffe.Net('invdeploy.prototxt',caffe.TEST)
#加载图像进行处理生成中间结果
net.blobs['data'].data[...] = transformer.preprocess('data', caffe.io.load_image('h2.jpg'))
out = net.forward()
#卷积/反卷积 参数共享
for b in invnet.params:
invnet.params[b][0].data[...] = net.params[b][0].data.reshape(invnet.params[b][0].data.shape)
invnet.blobs['pooled'].data[...] = feat
invnet.blobs['switches5'].data[...] = net.blobs['switches5'].data
invnet.blobs['switches2'].data[...] = net.blobs['switches2'].data
invnet.blobs['switches1'].data[...] = net.blobs['switches1'].data
invnet.forward()
#显示图像
plt.clf()
feat = norm(invnet.blobs['conv1'].data[0],255.0)
gci=plt.imshow(transformer.deprocess('data', feat))
plt.colorbar(gci);
plt.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))
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:])
plt.imshow(data)
plt.axis('off')
plt.show()
最终结果
原图1
中间结果1
原图2
中间结果2
978



被折叠的 条评论
为什么被折叠?



