Torch或Tensorflow中的通用递归神经网络

4
我正在尝试实现这个循环神经网络(它是一个语音活动检测器):

rnn

请注意,那些蓝色圆圈是单个神经元 - 它们不代表许多神经元。这是一个非常小的网络。还有一些额外的细节,比如 S 的含义以及某些层是二次的,但对于这个问题并不重要。
我使用微软的 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层的示例都是完全不透明的。

有人能向我展示如何在Torch或Tensorflow中实现像这样的网络吗(或两者都可以)?


嗨@Timmmm,我也在阅读这篇论文,想知道你是否已经成功实现和训练了基于RNN的VAD解决方案。如果是,请问你是否计划开源你的实现?或者你是否知道有任何开放的实现?谢谢! - ispin2121
不,我没有,并且我不知道是否有任何开源实现。如果我将其工作正常,我会开源它,但目前我正在开发一个唤醒词检测器。我将等待@chrisbasoglu的脚本接口发布后再尝试。 - Timmmm
顺便说一下,我发现使用PLP的理由不充分。通过我的唤醒词检测器,我已经成功地让网络学习了过滤器,所以我打算在这里尝试一下。这应该更简单(但需要更多的训练数据或正则化,因为有更多可学习的参数)。 - Timmmm
感谢分享信息。如果您想要有人合作完成这个项目,我很乐意看看我能做出什么贡献。我的兴趣更多地集中在拥有一个针对嵌入式环境的完整且独立的C实现(甚至是构建一个等效但低功耗的硬件解决方案)。然而,即使它是用其他语言或依赖于框架实现的,拥有一个工作基线也总是好的。 - ispin2121
1个回答

2

我是微软的员工。CNTK正在进行组件化,其关键高级构建块将以C++/Python库的形式提供。目标是通过启用可扩展性、与外部代码的互操作性和可组合性来增加工具包的灵活性。这些库组件组成并相互操作,形成深度学习工作负载所需的核心训练和评估功能。该库还允许实现一个或多个这些组件外部,从而使外部C++/Python代码和库与CNTK的库组件组合。预计将在8月底发布。


啊,听到这个消息很不错,谢谢你给出一个大致的日期! - Timmmm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接