mxnet中如何使用makeloss?

看到了幾個例子,但是試著寫的時候總是提示類似的錯誤.能否給一個linear regression的例子?謝謝.


文檔中有句話:Symbol API - mxnet 0.9.3 documentation,Get output from a symbol and pass 1 gradient back. This is used as a terminal loss if unary and binary operator are used to composite a loss with no declaration of backward dependency。

也就是為了組合額外的loss,但是既然組合時loss可以用,那麼MakeLoss可以用來自定義loss,那就拿線性回歸來嘗試吧,參照[1][2]:

# -*- coding=utf-8 -*-

import mxnet as mx
import numpy as np
import logging

logging.basicConfig(level=logging.INFO)

x = mx.sym.Variable(data)
y = mx.sym.FullyConnected(data=x, num_hidden=1)
label = mx.sym.Variable(label)
loss = mx.sym.MakeLoss(mx.sym.square(y - label))
pred_loss = mx.sym.Group([mx.sym.BlockGrad(y), loss])
ex = pred_loss.simple_bind(mx.cpu(), data=(32, 2))

# test
test_data = mx.nd.array(np.random.random(size=(32, 2)))
test_label = mx.nd.array(np.random.random(size=(32, 1)))

ex.forward(is_train=True, data=test_data, label=test_label)
ex.backward()

print ex.arg_dict
fc_w = ex.arg_dict[fullyconnected0_weight].asnumpy()
fc_w_grad = ex.grad_arrays[1].asnumpy()
fc_bias = ex.arg_dict[fullyconnected0_bias].asnumpy()
fc_bias_grad = ex.grad_arrays[2].asnumpy()

logging.info(fc_weight:{}, fc_weights_grad:{}.format(fc_w, fc_w_grad))
logging.info(fc_bias:{}, fc_bias_grad:{}.format(fc_bias, fc_bias_grad))

只要給出數據就好了。  

這裡需要注意的就是MakeLoss相當於自定義自己的loss層,其中並不包含我們sym的prediction,當我們需要loss和predictions時需要利用mx.sym.BlockGrad(y)獲取prediction,並通過Group可以將其合併起來,這裡的mx.sym.BlockGrad可以回傳零梯度,即可以實現不對y求導,僅獲取y的值.

  • [1] How to weight observations in mxnet?
  • [2] MakeLoss should accept optional output symbol · Issue #4737 · dmlc/mxnet · GitHub:


推薦閱讀:

如何看待MXNet在CVPR2017上公布的gluon介面?
Bring TensorBoard to MXNet
1.試水:可定製的數據預處理與如此簡單的數據增強(上)
mxnet 加入apache 之後會有哪些影響,未來如發展?

TAG:深度學習DeepLearning | mxnet |