Поделиться через


Разделы справки обучение моделей в BrainScript

Обучение на уровне

Чтобы выполнить многоуровневую подготовку, просто используйте несколько команд в файле конфигурации, где каждая команда имеет тип action=train.

command = TrainLayer1:TrainLayer2:TrainLayer3:EndToEndTrain:Test:Output

TrainLayer1= [ 
   action = train
   ...
]

TrainLayer2= [ 
   action = train
   ...
]
...

Обучение с целью многозадак

Вы можете просто определить объединенный критерий как выражение BrainScript, и вы можете отслеживать все потери отдельных задач, указав их как evaluationNodes.

task1loss = CrossEntropyWithSoftMax(prediction,label)
task2loss = SquareError(reconstruction,input)
mtloss = task1loss + Constant(0.3) .* task2loss 
criterionNodes = (mtloss)
evaluationNodes = (task1loss:task2loss)

Обучение модели регрессии на изображениях

Ниже описано, как спрогнозировать одно или несколько значений с плавающей запятой для входного изображения с помощью CNTK. Примером использования является прогнозирование ограничивающего прямоугольника, например (x, y, w, h) объекта на заданном изображении. Вы также можете думать о прогнозировании цены на автомобиль просто глядя на изображение этого автомобиля (было бы интересно на самом деле). Здесь мы используем очень простой пример, в котором мы обучаем сеть для прогнозирования средних RGB-значений изображения (нормализовано до [0, 1]). Однако те же действия применяются для других вариантов использования. Выполняемые этапы

  1. Определите как изображение, так и метки регрессии правды в качестве входных данных в сеть
  2. Определите сеть, которая прогнозирует соответствующее число значений w.r.t. меток регрессии.
  3. Определение функции потери, которая сравнивает прогнозируемые значения с истинностью земли
  4. Адаптация раздела чтения в файле конфигурации CNTK для чтения меток изображений и регрессии

Вот как это можно сделать. Полный файл конфигурации включен в папку Examples/Image/Regression/RegrSimple_CIFAR10.cntk. В этой папке также содержатся скрипты для скачивания данных изображения и создания основы регрессии для обучения и тестирования.

1–3) Определение входных данных, функции сети и потери:

    BrainScriptNetworkBuilder = [
        imageShape = 32:32:3
        featScale = Constant(1/256)
        labelDim = 3

        model (features) = {
            featNorm = Scale(features, featScale)
            h1 = LinearLayer {100,      init="gaussian", initValueScale=1.5} (featNorm)
            ol = LinearLayer {labelDim, init="gaussian", initValueScale=1.5} (h1)
        }.ol

        # inputs
        features = Input {imageShape}
        regrLabels = Input {labelDim}
        
        # apply model to features
        ol = model (features)

        # define regression loss
        # rmse = sqrt(SquareError(regrLabels, ol) / labelDim)
        sqerr = SquareError (regrLabels, ol)
        rmse = Sqrt (Constant(1/labelDim).* sqerr)

        featureNodes    = (features)
        labelNodes      = (regrLabels)
        criterionNodes  = (rmse)
        evaluationNodes = (rmse)
        OutputNodes     = (ol)
    ]
  1. Определение составного средства чтения с помощью ImageReader и CNTKTextFormatReader:
    reader = {
        verbosity = 0 ; randomize = true
        deserializers = ({
            type = "ImageDeserializer" ; module = "ImageReader"
            file = "$dataDir$/cifar-10-batches-py/train_map.txt"
            input = {
                features = { transforms = (
                    { type = "Scale" ; width = 32 ; height = 32 ; channels = 3 ; interpolations = "linear" } :
                    { type = "Transpose" }
                )}
                ignored = { labelDim = 10 }
            }
        } : {
            type = "CNTKTextFormatDeserializer" ; module = "CNTKTextFormatReader"
            file = "$dataDir$/cifar-10-batches-py/train_regrLabels.txt"
            input = {
                regrLabels = { dim = 3 ; format = "dense" }
            }
        })
    }

Средство чтения — это составное средство чтения, которое использует ImageReader для чтения изображений и CNTKTextFormatReader для чтения меток правды для регрессии. Это делается путем определения массива десериализаторов (using {...} : {...}) и назначения входных данных, как определено в сети выше (cf. features and regrLabels).

Полный файл конфигурации и соответствующий файл Сведений в этой папке см. в разделе Examples/Image/Miscellaneous/CIFAR-10/06_RegressionSimple.cntk .

Обучение классификатора с несколькими меткими

Для классификации с несколькими метками следует избегать использования CrossEntropy, так как он может обрабатывать только входные векторы, суммарные до 1. Разумной альтернативой является использование суммы функций логистической потери, по одному для каждого вывода.

...
probabilities = DenseLayer {outputSize, activation=Sigmoid} (hidden)
logisticLoss = Logistic (multiLabels, probabilities)
trainingCriterion = (logisticLoss)
...

Помимо самой потери, может потребоваться отслеживать другие метрики, такие как количество неверных прогнозов. Для этого нет встроенного выражения, но его можно выразить как

...
hammingLoss (y, p) = ReduceSum (y != (p > 0.5))
hl = hammingLoss(multiLabels,probabilities)
evaluationNodes = (hl)
...

Это подсчитывает количество раз y[i] не согласен с p[i]>0,5.

Начало работы в последовательности моделирования последовательности

В этой практической лаборатории описываются основные компоненты для начала обработки последовательностей, таких как текстовый формат CNTK, и настройка средства чтения для использования коротких псевдонимов для различных входных последовательностей. В примере grapheme to-phoneme (G2P) показана фактическая задача последовательности и последовательности.

Важной проблемой моделирования последовательности является декодирование тестовых данных с помощью поиска луча. Это можно сделать в разделе конфигурации, где действие верхнего уровня — write. Для декодирования требуется поиск наиболее вероятной последовательности выходных данных. В CNTK есть декодировщик поиска луча , но вы можете вызвать следующее:

BrainScriptNetworkBuilder = (BS.Seq2Seq.BeamSearchSequenceDecoderFrom (
                                        BS.Network.Load (decodeModelPath), beamSize))

и будет выполнять поиск луча с указанным размером луча. Для луча размером 1 есть специализированный жадный декодер

BrainScriptNetworkBuilder = (BS.Seq2Seq.GreedySequenceDecoderFrom (
                                        BS.Network.Load (decodeModelPath)))

Оба декодера имеют особые требования к сети, как показано в примере G2P

Обучение модели DSSM (или сверточных DSSM)

DSSM (или модель глубокого семантического сходства) — это модель DNN, обученная на парах исходных текстов, для изучения короткотекстового пространства внедрения, где ближе соответствующие пары исходного и целевого текста. Текстовые входные данные модели представлены предварительно вычисленным хэшом триграммы (см. Huang et al.). Для C-DSSM хэш триграммы вычисляется на слово, а затем объединяется в порядке, в котором слова происходят в тексте. Входные данные для обеих моделей имеют фиксированный размер. Если мы рассмотрим триграммы объемом 50 000, то входные данные DSSM, соответствующие источнику, и целевой текст будет вектор длиной 50 000 каждый. Для C-DSSM вектор будет иметь длину 50K x n, где сцепляются первые векторы слов n-1, а n-й вектор содержит сумму векторов, соответствующих всем остальным словам в тексте. Если в тексте меньше n слов, остальная часть вектора заполняется нулями. Для рисования аналогии с изображением можно представить текстовые входные данные для C-DSSM как изображение с измерениями 10x1 и 50K, хранящимися в [C x H x W] формате.

В этом примере показано, как обучить модель DSSM или C-DSSM с помощью CNTKTextFormatReader. Данные должны содержать 2 признака (исходный и целевой текст) и 1 метку (которая всегда имеет значение 1 в обучающих данных, так как она содержит только положительные выборки — во время обучения отрицательные целевые примеры создаются случайной выборкой). Ниже приведена конфигурация чтения.

reader = {
    verbosity   = 0
    randomize   = true

    deserializers = ({
        type    = "CNTKTextFormatDeserializer"
        module  = "CNTKTextFormatReader"
        file    = "data.txt"

        input = {
            Q   = { dim = 500000; format = "sparse" }
            D   = { dim = 500000; format = "sparse" }
            L   = { dim = 1;      format = "dense" }
        }
    })
}

Пример входных данных,

|L 1 |Q 482:1 761:1 1832:1 2117:1 12370:1 17131:1 17854:1 24976:1 27676:1 28055:1 28177:1 29507:1|D 482:1 761:1 1832:1 2117:1 12370:1 17131:1 17854:1 24976:1 27676:1 28055:1 28177:1 29507:1
|L 1 |Q 149:1 153:1 595:1 671:1 675:1 1110:1 1517:1 2077:1 2114:1 5533:1 5662:1 6886:1 6901:1 7294:1 12846:1 13033:1 16614:1 19425:1 22015:1 24839:1 24994:1 26196:1 26358:1 27565:1|D 149:1 153:1 595:1 671:1 675:1 1110:1 1517:1 2077:1 2114:1 5533:1 5662:1 6886:1 6901:1 7294:1 12846:1 13033:1 16614:1 19425:1 22015:1 24839:1 24994:1 26196:1 26358:1 27565:1
|L 1 |Q 187:1 2294:1 2800:1 6920:1|D 187:1 2294:1 2800:1 6920:1

И, наконец, определение сети,

BrainScriptNetworkBuilder = {
    # Constants scalars
    isConvolutional     = true
    numWords            = (if isConvolutional then 10 else 1)
    numTrigramsPerWord  = 50000
    numHiddenNodes      = 300
    wordWindowSize      = 3
    numWindows          = numWords - wordWindowSize + 1
    numNeg              = 50

    # Constant tensors
    CONST_GAMMA     = Constant(10)
    CONST_SHIFT     = Constant(1)
    CONST_NEG       = Constant(numNeg)
    CONST_PAD_NEG   = Constant(0, rows=numNeg, cols=1)
    CONST_PAD_POS   = Constant(1, rows=1, cols=1)
    CONST_PAD       = Splice(CONST_PAD_POS : CONST_PAD_NEG, axis=1)

    # Inputs
    Q   = Input(500000)
    D   = Input(500000)
    L   = Input(1)

    qr      = if isConvolutional
                then TransposeDimensions(ReshapeDimension(Q, 1, numTrigramsPerWord:1:numWords), 1, 3)
                else Slice(0, numTrigramsPerWord, Q, axis=1)
    dr      = if isConvolutional
                then TransposeDimensions(ReshapeDimension(D, 1, numTrigramsPerWord:1:numWords), 1, 3)
                else Slice(0, numTrigramsPerWord, D, axis=1)

    qdssm   = Sequential (
                DenseLayer {numHiddenNodes, activation=Tanh} :
                DenseLayer {numHiddenNodes, activation=Tanh} :
                DenseLayer {numHiddenNodes, activation=Tanh})
    qcdssm  = Sequential (
                ConvolutionalLayer {numHiddenNodes, (wordWindowSize:1), pad=false, activation=Tanh} :
                MaxPoolingLayer {(numWindows:1), stride=(1:1)} :
                DenseLayer {numHiddenNodes, activation=Tanh} :
                DenseLayer {numHiddenNodes, activation=Tanh})
    ddssm   = Sequential (
                DenseLayer {numHiddenNodes, activation=Tanh} :
                DenseLayer {numHiddenNodes, activation=Tanh} :
                DenseLayer {numHiddenNodes, activation=Tanh})
    dcdssm  = Sequential (
                ConvolutionalLayer {numHiddenNodes, (wordWindowSize:1), pad=false, activation=Tanh} :
                MaxPoolingLayer {(numWindows:1), stride=(1:1)} :
                DenseLayer {numHiddenNodes, activation=Tanh} :
                DenseLayer {numHiddenNodes, activation=Tanh})
    qembed  = if isConvolutional
                then qcdssm
                else qdssm
    dembed  = if isConvolutional
                then dcdssm
                else ddssm

    qf  = qembed(qr)
    df  = dembed(dr)
    lf  = Times(CONST_PAD, L)
    c   = CosDistanceWithNegativeSamples(qf, df, CONST_SHIFT, CONST_NEG)
    s   = Slice(0, 1, c, axis=1, tag="output")
    ce  = CrossEntropyWithSoftmax(lf, Scale(CONST_GAMMA, c), tag="criterion")
}

Примечание.

  • Хотя C-DSSM было показано, чтобы постоянно работать лучше, чем DSSM, он также тренируется медленнее (иногда до 5-10x медленнее). Поэтому в некоторых случаях вы можете повысить производительность DSSM в то же время обучения, обучая больше данных (или для более эпох).
  • Исходный DSSM / C-DSSM был обучен по парам заголовков запросов и документов. Но вы можете узнать другие связи между короткими текстами, обучая другим типам данных, таким как пары запросов сеансов или пары префикса-суффикса запроса.

Обучение автокодировщика изображений с помощью деконволюции и отмены пула

Здесь приведены инструкции.

Обучение обнаружения объектов с помощью Fast R CNN

Здесь приведены инструкции.