代码之家  ›  专栏  ›  技术社区  ›  ZHANG Juenjie

使用RNN生成一系列张量

  •  0
  • ZHANG Juenjie  · 技术社区  · 7 年前

    我正在构建rnn,并使用tf。nn。dynamic\u rnn生成输出和状态。 代码如下(tf版本1.3):

    import tensorflow as tf    
    def lstm_cell():
            return tf.contrib.rnn.DropoutWrapper(tf.contrib.rnn.BasicLSTMCell(128), output_keep_prob=0.7)
    
    cell= tf.contrib.rnn.MultiRNNCell([lstm_cell() for _ in range(3)])
    
    initial_state= cell.zero_state(1, tf.float32)
    
    layer = tf.placeholder(tf.float32, [1,1,36])
    
    outputs, state=tf.nn.dynamic_rnn(cell=cell, inputs=layer, initial_state=initial_state)
    

    由于输入张量始终为batch size=1,因此初始\u状态和状态也具有batch size 1。 层也是batch\u size=1的输入,每个单元有36个节点(嵌入序列的大小)。每层的lstm\U大小为128。

    当我循环rnn单元时,问题出现了。

    rnn_outputs_sequence=outputs
    for i in range(1, num_pics, 1):
        outputs, state=tf.nn.dynamic_rnn(cell=cell, inputs=outputs, initial_state=state)
        rnn_outputs_sequence=tf.concat((rnn_outputs_sequence, outputs),axis=1)
    

    rnn\u outputs\u序列应具有形状[1,num\u pics,36]。但是,这会触发一个错误:

    Trying to share variable rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel, but specified shape (256, 512) and found shape (164, 512).
    

    我想不出这个形状。 有人能帮我解决这个问题吗? 谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   ZHANG Juenjie    7 年前
    import tensorflow as tf
    def lstm_cell():
        return tf.contrib.rnn.DropoutWrapper(tf.contrib.rnn.BasicLSTMCell(128), output_keep_prob=0.7)
    
    cell= tf.contrib.rnn.MultiRNNCell([lstm_cell() for _ in range(2)])
    
    initial_state= cell.zero_state(1, tf.float32)
    
    layer = tf.placeholder(tf.float32, [1,1,36])
    
    outputs, state=tf.nn.dynamic_rnn(cell=cell, inputs=layer, initial_state=initial_state)
    
    outputs = tf.reshape(outputs, shape=[1, -1])
    outputs = tf.layers.dense(outputs, 36,\
                                     kernel_initializer=tf.contrib.layers.xavier_initializer(uniform=False))
    outputs = tf.reshape(outputs, shape=[1, 1, -1])
    rnn_outputs_sequence=outputs
    print(outputs)
    for i in range(1, 16, 1):
        outputs, state=tf.nn.dynamic_rnn(cell=cell, inputs=outputs, initial_state=state)
        outputs = tf.reshape(outputs, shape=[1, -1])
        outputs = tf.layers.dense(outputs, 36,\
                                     kernel_initializer=tf.contrib.layers.xavier_initializer(uniform=False))
        outputs = tf.reshape(outputs, shape=[1, 1, -1])
        print(outputs)
        rnn_outputs_sequence=tf.concat((rnn_outputs_sequence, outputs),axis=1)
    print(rnn_outputs_sequence)