Я пытаюсь реализовать this recurrent neural network (это активность детектора голоса):Общие рекуррентные нейронные сети в Факеле или Tensorflow
Обратите внимание, что эти синие круги отдельные нейроны - они не представляют многие нейроны. Это действительно маленькая сеть. Есть некоторые дополнительные детали, как то, что означает 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 (или обоих!)?
Hi @Timmmm, я также читал эту статью, и мне интересно, успешно ли вы используете это решение на базе RNN, которое было успешно реализовано и обучено. Если да, планируете ли вы открыть исходную версию своей реализации? Или вы знаете, есть ли открытая реализация в любом месте? Благодаря! – ispin2121
Нет, у меня нет, и я не знаю, есть ли какие-либо версии с открытым исходным кодом. Если я когда-нибудь его заработаю, я открою его источник, но в настоящее время я работаю над детектором горячего слова. Я собираюсь подождать, пока скриптовый интерфейс @ chrisbasoglu не повторит попытку. – Timmmm
Кстати, я нашел, что использование PLP плохо обосновано. С моим детектором горячих слов у меня был некоторый успех, позволяя сети изучать фильтры, поэтому я собираюсь попробовать это здесь. Также должно быть проще (но для этого потребуется больше данных обучения или регуляризации, так как есть более обучаемые параметры). – Timmmm