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

Torch或Tensorflow中的通用递归神经网络,tensorflow,torch,recurrent-neural-network,cntk,Tensorflow,Torch,Recurrent Neural Network,Cntk,我正在尝试实现(这是一个语音活动检测器): 请注意,这些蓝色圆圈是单独的神经元-它们并不代表许多神经元。这是一个非常小的网络。还有一些额外的细节,比如S的意思和一些层是二次的事实,但它们对这个问题并不重要 我是这样用微软的(未经测试!)实现的: PastValue()函数从上一时间步获取图层的值。这使得实现像这样不寻常的RNN变得非常容易 不幸的是,尽管CNTK的网络描述语言非常棒,但我发现您无法编写数据输入、培训和评估步骤的脚本这一事实相当严格。所以我正在研究在Torch或Tensorf

我正在尝试实现(这是一个语音活动检测器):

请注意,这些蓝色圆圈是单独的神经元-它们并不代表许多神经元。这是一个非常小的网络。还有一些额外的细节,比如S的意思和一些层是二次的事实,但它们对这个问题并不重要

我是这样用微软的(未经测试!)实现的:



PastValue()
函数从上一时间步获取图层的值。这使得实现像这样不寻常的RNN变得非常容易

不幸的是,尽管CNTK的网络描述语言非常棒,但我发现您无法编写数据输入、培训和评估步骤的脚本这一事实相当严格。所以我正在研究在Torch或Tensorflow中实现相同的网络

不幸的是,我已经阅读了这两方面的文档,我不知道如何实现重复连接。这两个库似乎都将RNN等同于LSTM黑匣子,就像它们是非重复层一样堆叠。似乎没有与
PastValue()
等效的方法,所有不使用预先制作的LSTM层的示例都是完全不透明的


有人能告诉我如何在Torch或Tensorflow(或两者)中实现这样的网络吗?

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

啊,听到这个消息真是太好了,谢谢你给了我一个粗略的日期!您好@timmm,我也在读这篇文章,我想知道您是否成功实施并培训了基于RNN的VAD解决方案。如果是,您是否计划开放您的实现的源代码?或者你知道在任何地方都有一个开放的实现吗?谢谢没有,我也不知道是否有开源实现。如果我能让它工作,我会把它开源,但目前我正在开发一个热词检测器。我要等到@chrisbasoglu的脚本接口出来后再试一次。顺便说一句,我发现使用PLP的理由不充分。通过我的hotword检测器,我在让网络学习过滤器方面取得了一些成功,所以我将在这里尝试一下。也应该更简单(但需要更多的培训数据或正规化,因为有更多可学习的参数)。感谢分享信息。如果你希望有人在这个项目上合作,我很高兴看到我是否有什么可以贡献的。我的兴趣更多的是拥有一个针对嵌入式环境的完整的+独立的C实现(或者甚至构建一个等效的低功耗硬件解决方案)。然而,有一个工作基线总是好的,即使它是用其他语言编写的或依赖于一个框架。
# 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))