Пользовательская функция активации mxnet / op в numpy

У меня есть вопрос относительно синтаксиса, используемого при создании пользовательской функции/операции активации в mxnet. Я смотрел на этот пример: https://github.com/dmlc/mxnet/blob/master/example/numpy-ops/custom_softmax.py

В частности, эта часть:

class Softmax(mx.operator.CustomOp):
    def forward(self, is_train, req, in_data, out_data, aux):
        x = in_data[0].asnumpy()
        y = np.exp(x - x.max(axis=1).reshape((x.shape[0], 1)))
        y /= y.sum(axis=1).reshape((x.shape[0], 1))
        self.assign(out_data[0], req[0], mx.nd.array(y))

    def backward(self, req, out_grad, in_data, out_data, in_grad, aux):
        l = in_data[1].asnumpy().ravel().astype(np.int)
        y = out_data[0].asnumpy()
        y[np.arange(l.shape[0]), l] -= 1.0
        self.assign(in_grad[0], req[0], mx.nd.array(y))

Что происходит с in_data[0] против in_data[1] и out_data[0] против out_data[1]? Чему соответствуют индексы?

Спасибо!


person darius    schedule 02.04.2017    source источник


Ответы (1)


in_data=[ввод, метка], out_data=[выход]

Взгляните на выходной API softmax: https://github.com/dmlc/mxnet/blob/master/src/operator/softmax_output-inl.h

CHECK_EQ(in_data.size(), 2U) << "SoftmaxOutput Input: [data, label]";
CHECK_EQ(out_data.size(), 1U) << "SoftmaxOutput Output: [output]";
person kevinthesun    schedule 03.04.2017