Torch 或 Tensorflow 中的通用循环神经网络

Posted

技术标签:

【中文标题】Torch 或 Tensorflow 中的通用循环神经网络【英文标题】:Generic recurrent neural networks in Torch or Tensorflow 【发布时间】:2016-08-12 19:22:13 【问题描述】:

我正在尝试实现this recurrent neural network(它是一个语音活动检测器):

请注意,这些蓝色圆圈是单个神经元 - 它们并不代表许多神经元。这是一个非常小的网络。还有一些额外的细节,例如 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 解决方案。如果是,您是否打算开源您的实现?或者你知道是否有任何地方的开放实现?谢谢! 不,我没有,也不知道是否有任何开源实现。如果我让它工作,我会开源它,但目前我正在研究一个热门词检测器。我要等到@chrisbasoglu 的脚本界面出来再试一次。 顺便说一句,我发现使用 PLP 的理由很不合理。使用我的启动词检测器,我在让网络学习过滤器方面取得了一些成功,所以我要在这里尝试一下。也应该更简单(但需要更多的训练数据或正则化,因为有更多可学习的参数)。 感谢分享信息。如果您希望有人在该项目上进行合作,我很高兴看到是否有任何我可以贡献的东西。我的兴趣更多是关于拥有一个针对嵌入式环境的完整+独立的 C 实现(甚至构建一个等效但低功耗的硬件解决方案)。然而,有一个工作基线总是好的,即使它使用其他语言或依赖于框架。 【参考方案1】:

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

【讨论】:

啊,很高兴听到这个消息,感谢您提供粗略的约会!

以上是关于Torch 或 Tensorflow 中的通用循环神经网络的主要内容,如果未能解决你的问题,请参考以下文章

新系统Ubuntu18.4以上深度工具合集安装(Nvidia+CUDA+Tensorflow+Caffe+Torch)

Tensorflow 中的图像变形

如何选择深度学习框架 TensorFlow/Torch/Mxnet/Theano

深度 初学者怎么选择神经网络环境?对比MATLABTorch和TensorFlow

tensorflow 和 torch.cuda 可以找到 GPU,但 Keras 不能

将在 tensorflow 中训练的神经网络部署到 Torch C++ 的最佳方法是啥?