CNTK Нейронная сеть с выходом не одного горячего вектора (мультиклассовый классификатор)

Спасибо за CNTK Tool, примеры выполняются довольно быстро. Несколько дней пытаюсь настроить простую сеть, но не получается. Мне нужна сеть с 2 входами и 3 выходами, например:

|features 0.3 0.5 |labels 0.2 0.7 0.9

Выходные данные не являются горячим вектором, сеть должна изучить значения меток 0.2 0.7 0.9. Но в большинстве примеров в качестве вывода используется one-hot-vector, поэтому мне непонятно, как это решить. Я пытался изменить туториал с классификацией 3, но это не работает, сеть неправильно усваивает вывод. Сеть, которую я пробовал, это:

BrainScriptNetworkBuilder = {

    SDim = 2     # feature dimension
    H1Dim = 50   # hidden dimension
    H2Dim = 50   # hidden dimension
    LDim = 3     # number of classes (labels)

    model (features) = {
        W0 = ParameterTensor {(H1Dim:SDim)}  ; b0 = ParameterTensor {H1Dim}
        W1 = ParameterTensor {(H2Dim:H1Dim)} ; b1 = ParameterTensor {H2Dim}
        W2 = ParameterTensor {(LDim:H2Dim)}  ; b2 = ParameterTensor {LDim}

        r1 = ReLU(W0 * features + b0) # hidden layer 1
        r2 = ReLU(W1 * r1       + b1) # hidden layer 2
        z =  ReLU(W2 * r2       + b2) 
    }.z

    # define inputs
    features = Input {SDim, sparse = false}
    labels   = Input {LDim, sparse = false} 

    # apply model to features
    z = model (features)

    # define criteria and output(s)
    ce  = SquareError(labels, z)  # criterion (loss)
    err = SquareError(labels, z)  # additional metric

    # connect to the system. These five variables must be named exactly like this.
    featureNodes    = (features)
    inputNodes      = (labels)
    criterionNodes  = (ce)
    evaluationNodes = (err)
    outputNodes     = (z)
}

Так вот у меня вопрос: Как настроить сеть в CNTK, чтобы на выходе не был один горячий вектор?

Спасибо за помощь.


person Guest_2015    schedule 22.08.2017    source источник


Ответы (1)


Когда ваша метка не является однократным вектором, SquareError является хорошей функцией потерь для минимизации. Если в некоторых примерах есть однократная метка, вы все равно можете использовать SquareError. Поэтому я думаю, что вы все делаете правильно, возможно, вам придется просто настроить скорость обучения, чтобы она работала хорошо.

person Nikos Karampatziakis    schedule 22.08.2017
comment
Спасибо, Никос, поскольку я знаю, что настройка сети прошла нормально, я нашел правильные параметры обучения. Теперь это работает хорошо. Я использовал параметр обучения, такой как 0,02 * 400: 0,003 * 400: 0,002 * 400: 0,001, также у меня сложилось впечатление, что в задачах с несколькими классификаторами активация ReLU намного лучше, чем функция Sigmoid. Спасибо за вашу помощь. - person Guest_2015; 23.08.2017