mxnet下如何檢視中間結果
阿新 • • 發佈:2018-12-29
https://blog.csdn.net/disen10/article/details/79376631
檢視權重
在訓練過程中,有時候我們為了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]))