在模型訓練中,有時候需要把模型的權重可視化出來,檢查模型權重是否有問題。caffe模型中可視化往往需要一個prototxt文件,不是很方便,因此需要可以直接利用model解析的方法。
一、利用model和prototxt可視化
import caffe
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
deploy = 'pose_deploy.prototxt'
model = 'pose_iter_440000.caffemodel'
net = caffe.Net(deploy, model, caffe.TEST)
def show_para(data):
data = (data-data.min())/(data.max()-data.min())
n = int(np.ceil(np.sqrt(data.shape[0])))
padding = (((0, n**2-data.shape[0]),(0,1),(0,1))+((0,0),)*(data.ndim-3))
data = np.pad(data,padding, mode='constant', constant_values=1)
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()
layer_analyse = ["conv4_2"]
threshold = 0.01
for i, layer in enumerate(net.params):
#print layer
if layer not in layer_analyse:
continue
data = net.params[layer][0].data
show_para(data[0])
print net.params[layer][0].data.shape
二、只利用model可視化
import caffe.proto.caffe_pb2 as caffe_pb2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
model_name = 'pose_iter_440000.caffemodel'
model = caffe_pb2.NetParameter()
f = open(model_name, 'rb')
model.ParseFromString(f.read())
f.close()
def show_para(data):
data = (data-data.min())/(data.max()-data.min())
n = int(np.ceil(np.sqrt(data.shape[0])))
padding = (((0, n**2-data.shape[0]),(0,1),(0,1))+((0,0),)*(data.ndim-3))
data = np.pad(data,padding, mode='constant', constant_values=1)
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()
layers = model.layer
layer_analyse = ["conv4_2"]
threshold = 0.01
for i, layer in enumerate(layers):
#print layer
layer_name = layer.name
if layer_name not in layer_analyse:
continue
data = np.array(layer.blobs[0].data)
data = data.reshape((512,512,3,-1))
#print data
show_para(data[0])
print data.shape
三、結果