自定义目标函数是深度学习应用中经常需要的操作。MXNet中可以直接使用Python+Numpy定义新的目标函数,比较方便。下面简单举个例子。
目标
由于手头上的训练集有些样本没有标注(没有标注的label设定为-1),在进行linear regression的时候想去掉这些标注,注意,这里不是去掉样本,只是做back propogation的时候对这些标注的error 返回为0 (即相应返回的gradient为0)。因此需要实现一个自定义的loss layer。
loss layer定义
loss layer的定义包括几个工作:
- 继承operator.NumpyOp类
- 定义方法:list_argument, list_output。这里由于是loss layer,输入就是data 和label,输出是output。无需改变。
- infer_shape 方法:定义label和data数组的shape,代码里有相应的注释。这里读者可能会问,为什么还要定义呢?不是输入的label和data已经有了吗?考虑这样一个问题:对于softmax, 做1000类分类,虽然输入的维度是1000,可是输出的维度是1。而对于1000维的线性回归问题,输入1000,输出也是1000。因此需要在代码里手动定义。
- 定义forward和backward方法。这里就是实现目标函数逻辑的部分了。需要注意的是输入参数的含义。下面代码的注释里给出了每个参数具体的说明。
class LinearRegMissingLabel(mx.operator.NumpyOp):
def __init__(self):
super(LinearRegMissingLabel, self).__init__(False)
def