https://blog.csdn.net/disen10/article/details/79376631
固定權重:https://www.cnblogs.com/chenyliang/p/6780019.html
固定權重:https://discuss.gluon.ai/t/topic/1164
查看權重
在訓練過程中,有時候我們為了debug而需要查看中間某一步的權重信息,在mxnet中,我們可以很方便的調用get_params()方法來得到權重信息。
-
'''
-
查看權重示例代碼
-
轉載時注明地址:http://blog.csdn.net/u010414386?viewmode=contents
-
'''
-
import mxnet as mx
-
sym, arg_params, aux_params = mx.model.load_checkpoint( 'resnet-50',0)#載入模型
-
mod = mx.mod.Module(symbol=sym,context=mx.gpu()) #創建Module
-
mod.bind(for_training= False,data_shapes=[('data',(1,3,224,224))]) #綁定,此代碼為預測代碼,所以training參數設為False
-
mod.set_params(arg_params,aux_params)
-
import numpy as np
-
import cv2
-
def get_image(filename):
-
img = cv2.imread(filename)
-
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
-
img = cv2.resize(img,( 224,224))
-
img = np.swapaxes(img, 0,2)
-
img = np.swapaxes(img, 1,2)
-
img = img[np.newaxis,:]
-
return img
-
from collections import namedtuple
-
Batch = namedtuple( 'Batch',['data'])
-
img = get_image( 'val_1000/0.jpg') #獲取圖片
-
mod.forward(Batch([mx.nd.array(img)])) #預測結果
-
################################################
-
#debug模式下,獲取權重信息
-
keys = mod.get_params()[ 0].keys() # 列出所有權重名稱
-
conv_w = mod.get_params()[ 0]['conv0_weight'] #獲取想要查看的權重信息,如conv_weight
-
print conv_w.asnumpy() #查看具體數值
-
################################################
-
prob = mod.get_outputs()[ 0].asnumpy()
-
y = np.argsort(np.squeeze(prob))[:: -1]
-
print( 'truth label %d; top-1 predict label %d' % (val_label[0], y[0]))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
查看中間輸出結果
由於mxnet的網絡由symbol組成,而symbol又屬於符號式編程,所以我們不能像上面查看權重一樣直接查看,我們需要把我們想看的輸出結果保存下來。
-
'''
-
方法一
-
查看中間結果代碼
-
轉載時注明地址:http://blog.csdn.net/u010414386?viewmode=contents
-
'''
-
import mxnet as mx
-
net = mx.symbol.Variable( 'data')
-
fc1 = mx.symbol.FullyConnected(data=net, name= 'fc1', num_hidden=128)
-
net = mx.symbol.Activation(data=fc1, name= 'relu1', act_type="relu")
-
net = mx.symbol.FullyConnected(data=net, name= 'fc2', num_hidden=64)
-
out = mx.symbol.SoftmaxOutput(data=net, name= 'softmax')
-
# 通過把兩個輸出組成一個group來得到自己需要查看的中間層輸出結果
-
group = mx.symbol.Group([fc1, out])
-
print group.list_outputs()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
-
'''
-
方法二
-
有時候我們使用別人的模型,所以無法像方法一一樣在定義模型的時候就確定需要查看的中間層輸出結果,
-
這時候我們使用get_internals()方法來查找自己需要查看的中間層
-
轉載時注明地址:http://blog.csdn.net/u010414386?viewmode=contents
-
'''
-
import mxnet as mx
-
sym, arg_params, aux_params = mx.model.load_checkpoint( 'resnet-50',0)#載入模型
-
########################################################################
-
args = sym.get_internals().list_outputs() #獲得所有中間輸出
-
internals = model.symbol.get_internals()
-
fc1 = internals[ 'fc1_output']
-
conv = internals[ 'stage4_unit3_conv1_output']
-
group = mx.symbol.Group([fc1, sym, conv]) #把需要輸出的結果按group方式組合起來,這樣就可以得到中間層的輸出
-
#########################################################################
-
mod = mx.mod.Module(symbol=group,context=mx.gpu()) #創建Module
-
mod.bind(for_training= False,data_shapes=[('data',(1,3,224,224))]) #綁定,此代碼為預測代碼,所以training參數設為False
-
mod.set_params(arg_params,aux_params)
-
import numpy as np
-
import cv2
-
def get_image(filename):
-
img = cv2.imread(filename)
-
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
-
img = cv2.resize(img,( 224,224))
-
img = np.swapaxes(img, 0,2)
-
img = np.swapaxes(img, 1,2)
-
img = img[np.newaxis,:]
-
return img
-
from collections import namedtuple
-
Batch = namedtuple( 'Batch',['data'])
-
img = get_image( 'val_1000/0.jpg') #獲取圖片
-
mod.forward(Batch([mx.nd.array(img)])) #預測結果
-
prob = mod.get_outputs()[ 0].asnumpy()
-
y = np.argsort(np.squeeze(prob))[:: -1]
-
print( 'truth label %d; top-1 predict label %d' % (val_label[0], y[0]))