【问题标题】:如何在tensorflow的多个rnn层中设置不同的权重变量?
【发布时间】:2017-09-27 13:22:37
【问题描述】:

您好,我正在编写一个“多(输入)到多(输出)”的 rnn 代码来处理字符预测。为此,我将隐藏层参数设置如下。三个隐藏层,每个隐藏层有 100、200 和 300 个隐藏单元。

hidden layers= [100,200,300] 

我的代码是这样的。

# parameters.
hiddenLayers = [100,200,300]
timeStep = 20 # sequence length
inputDimension = 38 (# of English alphabet + symbols)
outputDimension = 38 (# of English alphabet + symbols)
input_x = tf.placeholder(tyf.float64, [None, timeStep, inputDimension])

# make weights
w1 = tf.get_variable("w1",[hiddenUnits[0],hiddenUnits[1] ],initializer=tf.random_normal_initializer())
w2 = tf.get_variable("w2",[hiddenUnits[1],hiddenUnits[2] ],initializer=tf.random_normal_initializer())
w3 = tf.get_variable("w3",[hiddenUnits[2],outputDimension ],initializer=tf.random_normal_initializer())
# make biases
b1 = tf.get_variable("b1",[hiddenUnits[1]], initializer=tf.constant_initializer(0.0))
b2 = tf.get_variable("b2",[hiddenUnits[2]], initializer=tf.constant_initializer(0.0))
b3 = tf.get_variable("b3",[outputDimension], initializer=tf.constant_initializer(0.0))

def cell_generator(hiddenUnits):
    return rnn_cell = rnn.BasicLSTMCell(hiddenUnits, forget_bias=1.0)

rnn_cell = rnn.MultiRNNCell([cell_generator(_) for _ in hiddenLayers])
outputs, states = tf.nn.dynamic_rnn(rnn_cell, input_x, dtype=tf.float64)

现在我有 3 个隐藏层,每个隐藏层都有不同数量的隐藏单元。 当我打印出“输出”和“状态”时,他们说这样。 (我没有运行会话。)

print(outputs)
Tensor("rnn/transpose:0", shape=(?, 20, 300), dtype=float64)

print(states)
(LSTMStateTuple(c=<tf.Tensor 'rnn/while/Exit_2:0' shape=(?, 100) dtype=float64>, h=<tf.Tensor 'rnn/while/Exit_3:0' shape=(?, 100) dtype=float64>),
LSTMStateTuple(c=<tf.Tensor 'rnn/while/Exit_4:0' shape=(?, 200) dtype=float64>, h=<tf.Tensor 'rnn/while/Exit_5:0' shape=(?, 200) dtype=float64>),
LSTMStateTuple(c=<tf.Tensor 'rnn/while/Exit_6:0' shape=(?, 300) dtype=float64>, h=<tf.Tensor 'rnn/while/Exit_7:0' shape=(?, 300) dtype=float64>))

我认为“输出”应该包含 3 个隐藏层的每个输出,但它只有最后一个隐藏层,所以我迷失了在哪里乘以第一个和第二个权重。所以现在我有问题。

  1. 我可以使用包含 3 个隐藏层的“状态”变量,这样我就可以乘以我的 3 个权重并为每个最后的状态添加 3 个偏差。

例如...

hidden2 = tf.matmul(state[0],w1) + b1
hidden3 = tf.matmul(state[1],w2) + b2
final_output = tf.matmul(state[2],w3) + b3
# and do the loss calculation for training...
  1. 有什么方法可以使用“输出”变量来将我的权重和偏差应用于该单元格?

  2. 或者还有其他替代方法可以使用我的权重和偏差吗?也许在前面的步骤中初始化权重和偏差(在将 basicRNNCell 扔到 MultiRNNcell 之前)?

我真的很想设置不同数量的隐藏层和单元,并使用我预先确定的权重和偏差参数应用它们。如果您有任何想法,请告诉我。

提前致谢。

【问题讨论】:

    标签: python parameters tensorflow lstm recurrent-neural-network


    【解决方案1】:

    我认为“输出”应该包含 3 个隐藏层的每个输出,但它只有最后一个隐藏层,所以我迷失了在哪里乘以第一个和第二个权重。所以现在我有问题。

    通过在 3 个单元上调用 MultiRNNCell,您可以创建一个多层网络,其中每个单元都是一个层(就像在正常的全连接网络中可以有多个层一样),每一层都馈入下一层,例如:

    input -> cell1 -> cell2 -> cell3 -> output
    

    所以你的 RNN 的输出是 cell3 的输出,因此是 (?, 20, 300) 形状。获得最终输出所需的唯一变量是w3b3,例如

    final_output = tf.nn.softmax(tf.matmul(outputs, w3) + b3)
    

    它会为您提供类中的预测分布。

    【讨论】:

    • 感谢您的评论。然后听起来好像因为 multiRNNCell 将多个隐藏层收集到一个大网络中,所以在构建它之后我可能无法访问其中一个层,除了最后一层。我宁愿生成多个 dynamic_rnn 单元(而不是使用 multiRNNCell),并使用我预先确定的权重和偏差来处理这些输出。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    相关资源
    最近更新 更多