Вывод MXNET softmax: путаница в форме этикетки - PullRequest
0 голосов
/ 02 октября 2018

У меня нет четкого представления о том, как должны формироваться метки для классификатора softmax.

Что я мог понять из моих экспериментов, так это то, что скалярный Лабер, указывающий индекс выходной вероятности класса, является одним из вариантов,в то время как другая - это двухмерная метка, где строки представляют собой вероятности класса, или переменную с горячим кодированием, например, c (1, 0, 0).

Что меня удивляет, так это:

  • Я могу использовать значения меток sclalar, которые идут без индексации, как 4 в моем примере ниже - без предупреждения или ошибки.Почему это так?
  • Когда моя метка является отрицательным скаляром или массивом с отрицательным значением, модель сходится к равномерному распределению вероятности по классам.Например, ожидается ли, что actor_train.y = matrix(c(0, -1,v0), ncol = 1) приведет к равным вероятностям в выводе softmax?
  • Я пытаюсь использовать классификатор softmax MXNET для получения обучения по принципу градиента политики, а мои отрицательные вознаграждения приводят квопрос выше: равномерная вероятность.Это ожидаемое?

    require (mxnet)

    actor_initializer <- mx.init.Xavier (rnd_type = "gaussian", factor_type = "avg", величина = 0.0001) </p>

    actor_nn_data <- mx.symbol.Variable ('data') actor_nn_label <- mx.symbol.Variable ('label') </p>

    device.cpu <- mx.cpu () </p>

    NNархитектура

    actor_fc3 <- mx.symbol.FullyConnected (data = actor_nn_data, num_hidden = 3) </p>

    actor_output <- mx.symbol.actor ') </p>

    crossentfunc <- функция (label, pred) {- sum (label * log (pred))} </p>

    actor_loss <- mx.metric.custom (feval = crossentfunc, name= "log-loss") </p>

    инициализировать NN

    actor_train.x <- матрица (rnorm (11), nrow = 1) </p>

    actor_train.y = 0 # 1# 2 # 3 # -3 # матрица (c (0, 0, -1), ncol = 1)

    rm (actor_model)

    actor_model <- mx.model.FeedForward.create(символ = actor_output, X = actor_train.x, y = actor_train.y, ctx= device.cpu, num.round = 100, array.batch.size = 1, оптимизатор = 'adam', eval.metric = actor_loss, clip_gradient = 1, wd = 0.01, initializer = actor_initializer, array.layout = "rowmajor") </p>

    прогноз (actor_model, actor_train.x, array.layout = "rowmajor")

1 Ответ

0 голосов
/ 04 октября 2018

Это довольно странно для меня, но я нашел решение.

Я изменил оптимизатор с optimizer = 'adam' на optimizer = 'rmsprop', и NN начал сходиться, как и ожидалось, в случае отрицательных целей.Я сделал симуляции в R, используя простую функцию NN и optim, чтобы получить тот же результат.

Похоже, что adam или SGD могут содержать ошибки или что-то еще в случае полиномиальной классификации ... Я такжеЯ застрял в том факте, что эти оптимизаторы не сходятся к идеальному решению только на одном примере, в то время как rmsprop да!Будь в курсе!

...