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

时间:2016-04-20 08:40:23

标签: tensorflow torch recurrent-neural-network cntk

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

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中实现这样的网络(或两者兼而有之!)?

1 个答案:

答案 0 :(得分:2)

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