Я хочу реализовать метод регуляризации Shakeout в CNTK

Существует документ «Shakeout: новый подход к регуляризованному обучению глубоких нейронных сетей», который можно найти здесь: http://ieeexplore.ieee.org/abstract/document/7920425/

В этой статье представлен новый метод регуляризации, который может заменить выпадающие слои более функциональным способом. Я работаю над проблемой глубокого обучения, и для этого я хочу реализовать метод «встряски», но проблема в том, что я не мог полностью понять фактический конвейер из бумаги. Слишком много математики, которую я все еще пытаюсь понять.

До сих пор я видел одну реализацию с открытым исходным кодом, основанную на «Caffe», но я всего лишь новичок в глубоком обучении и только учусь использовать CNTK. поэтому невозможно начать работать в кафе. Кто-нибудь реализовал "Shakeout" в cntk? или если кто-то может предоставить псевдокод для встряхивания? Реализация Shakeout в Caffe: https://github.com/kgl-prml/shakeout-for-caffe

Ошибка Github: https://github.com/kgl-prml/shakeout-for-caffe/issues/1


person Mobeen    schedule 28.07.2017    source источник
comment
Хотя это очень информация, я не понял, что именно вы спрашиваете. Не могли бы вы уточнить свой фактический вопрос?   -  person Zp Bappi    schedule 02.08.2017
comment
Я отредактировал вопрос, чтобы уточнить. Любое направление о том, как я могу реализовать Shakeout в cntk.   -  person Mobeen    schedule 07.08.2017


Ответы (1)


При беглом взгляде на бумагу плотный слой в сочетании с выбивным слоем будет выглядеть следующим образом:

def DenseWithShakeout(rate, c, outputs):
    weights = C.parameter((C.InferredDimension, outputs), init=C.glorot_uniform())
    bias = C.parameter(outputs)
    def shakeout(x):
        r = C.dropout(x, rate)
        signs = weights/C.abs(weights) # one day CNTK should add an actual sign operation
        return C.times(r, weights) + c * C.times(r - x, signs) + bias
    return shakeout

Это можно использовать внутри оператора C.layers.Sequential(), например.

model = C.layers.Sequential([Dense(0.2, 1, 100), DenseWithShakeout(10)]) 

создаст двухслойную сеть со слоем встряхивания посередине. Обратите внимание, я на самом деле не пробовал это на какой-либо реальной проблеме.

person Nikos Karampatziakis    schedule 17.08.2017