2016-04-20 7 views
3

Я пытаюсь реализовать this recurrent neural network (это активность детектора голоса):Общие рекуррентные нейронные сети в Факеле или Tensorflow

rnn

Обратите внимание, что эти синие круги отдельные нейроны - они не представляют многие нейроны. Это действительно маленькая сеть. Есть некоторые дополнительные детали, как то, что означает S, и тот факт, что некоторые слои квадратичны, но они не имеют значения для этого вопроса.

Я реализовал это с помощью Microsoft, CNTK как это (не тестировался!):

# For the layers with diagonal connections. 
QuadraticWithDiagonal(X, Xdim, Ydim) 
{ 
    OldX = PastValue(Xdim, 1, X) 
    OldY = PastValue(Ydim, 1, Y) 

    Wqaa = LearnableParameter(Ydim, Xdim) 
    Wqbb = LearnableParameter(Ydim, Xdim) 
    Wqab = LearnableParameter(Ydim, Xdim) 
    Wla = LearnableParameter(Ydim, Xdim) 
    Wlb = LearnableParameter(Ydim, Xdim) 
    Wlc = LearnableParameter(Ydim, Xdim) 
    Wb = LearnableParameter(Ydim) 

    XSquared = ElementTimes(X, X) 
    OldXSquared = ElementTimes(OldX, OldX) 
    CrossXSquared = ElementTimes(X, OldX) 

    T1 = Times(Wqaa, XSquared) 
    T2 = Times(Wqbb, OldXSquared) 
    T3 = Times(Wqab, CrossXSquared) 

    T4 = Times(Wla, X) 
    T5 = Times(Wlb, OldX) 
    T6 = Times(Wlc, OldY) 

    Y = Plus(T1, T2, T3, T4, T5, T6, Wb) 
} 


# For the layers without diagonal connections. 
QuadraticWithoutDiagonal(X, Xdim, Ydim) 
{ 
    OldY = PastValue(Ydim, 1, Y) 

    Wqaa = LearnableParameter(Ydim, Xdim) 
    Wla = LearnableParameter(Ydim, Xdim) 
    Wlc = LearnableParameter(Ydim, Xdim) 
    Wb = LearnableParameter(Ydim) 

    XSquared = ElementTimes(X, X) 

    T1 = Times(Wqaa, XSquared) 
    T4 = Times(Wla, X) 
    T6 = Times(Wlc, OldY) 

    Y = Plus(T1, T4, T6, Wb) 
} 


# The actual network. 

# 13x1 input PLP. 
I = InputValue(13, 1, tag="feature") 
# Hidden layers 
H0 = QuadraticWithDiagonal(I, 13, 3) 
H1 = QuadraticWithDiagonal(H0, 3, 3) 
# 1x1 Pre-output 
P = Tanh(QuadraticWithoutDiagonal(H1, 3, 1)) 
# 5x1 Delay taps 
D = QuadraticWithoutDiagonal(P, 1, 5) 
# 1x1 Output 
O = Tanh(QuadraticWithoutDiagonal(D, 5, 1)) 

PastValue() функция получает значение слоя от предыдущего ный временной шаг. Это делает его действительно легко реализует необычные RNN, подобные этому.

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

К сожалению, я прочитал документацию для обоих, и я не знаю, как реализовать повторяющиеся соединения. Обе библиотеки, похоже, приравнивают RNN с черными ящиками LSTM, которые вы складываете, как если бы они были непериодическими слоями. Кажется, что нет эквивалента PastValue(), и все примеры, которые не только используют предварительно подготовленный слой LSTM, полностью непрозрачны.

Может ли кто-нибудь показать мне, как реализовать такую ​​сеть как в факеле, так и в Tensorflow (или обоих!)?

+0

Hi @Timmmm, я также читал эту статью, и мне интересно, успешно ли вы используете это решение на базе RNN, которое было успешно реализовано и обучено. Если да, планируете ли вы открыть исходную версию своей реализации? Или вы знаете, есть ли открытая реализация в любом месте? Благодаря! – ispin2121

+0

Нет, у меня нет, и я не знаю, есть ли какие-либо версии с открытым исходным кодом. Если я когда-нибудь его заработаю, я открою его источник, но в настоящее время я работаю над детектором горячего слова. Я собираюсь подождать, пока скриптовый интерфейс @ chrisbasoglu не повторит попытку. – Timmmm

+0

Кстати, я нашел, что использование PLP плохо обосновано. С моим детектором горячих слов у меня был некоторый успех, позволяя сети изучать фильтры, поэтому я собираюсь попробовать это здесь. Также должно быть проще (но для этого потребуется больше данных обучения или регуляризации, так как есть более обучаемые параметры). – Timmmm

ответ

2

Я сотрудник Microsoft. CNTK в настоящее время компонентно, и его ключевые высокоуровневые строительные блоки будут предлагаться в виде библиотеки C++/Python. Целью является увеличение гибкости в использовании инструментария, позволяя расширяемость, совместимость с внешним кодом и композиционную способность. Эти компоненты библиотеки составляют и взаимодействуют, чтобы сформировать основные возможности для обучения и оценки, необходимые для глубоких нагрузок. Библиотека также позволяет реализовать один или несколько из этих компонентов извне, позволяя составлять внешний код и библиотеки C++/Python с библиотечными компонентами CNTK. Ожидайте этого к концу августа.

+0

А это очень приятно слышать, и спасибо за то, что вы даете грубую дату! – Timmmm

 Смежные вопросы

  • Нет связанных вопросов^_^