如何在tensorflow中的多个rnn层中设置不同的权重变量?

时间:2017-04-29 14:36:28

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

您好我正在写很多(输入)到很多(输出)"用于处理字符预测的代码。为此,我将隐藏的图层参数设置如下。三个隐藏层,每个隐藏层有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>))

我认为&#34;输出&#34;应该保存3个隐藏层的每个输出,但它只有最后一个隐藏层,所以我迷失了第一和第二权重乘以的地方。所以现在我有疑问。

  1. 我可以使用&#34;状态&#34;包含3个隐藏层的变量,这样我可以将我的3个权重相乘,并为每个最后的状态添加3个偏差。
  2. 例如......

    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. 有什么方法可以使用&#34;输出&#34;变量,以便将我的权重和偏差应用于该单元格?

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

    3. 我真的想设置不同数量的隐藏图层和单位,并将它们与我预定的重量和偏差参数一起应用。如果您有任何想法,请告诉我。

      提前致谢。

1 个答案:

答案 0 :(得分:1)

  

我认为“输出”应该保存3个隐藏层的每个输出,但它只有最后一个隐藏层,所以我迷失了第1和第2个权重乘以的地方。所以现在我有疑问。

通过在3个单元格上调用MultiRNNCell,您可以创建一个多层网络,其中每个单元格都是单个图层(就像在普通的完全连接的网络中一样,您可以拥有多个图层),并且每个图层都会进入下一个图层,像:

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

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

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

它可以为您提供类别的预测分布。