2017-04-13 98 views
1

我在Tensorflow中製作LSTM神經網絡。Tensorflow LSTM - 在LSTM單元上的矩陣乘法

輸入張量大小是92

import tensorflow as tf 
from tensorflow.contrib import rnn 
import data 

test_x, train_x, test_y, train_y = data.get() 

# Parameters 
learning_rate = 0.001 
epochs = 100 
batch_size = 64 
display_step = 10 

# Network Parameters 
n_input = 28 # input size 
n_hidden = 128 # number of hidden layers 
n_classes = 20 # output size 

# Placeholders 
x = tf.placeholder(dtype=tf.float32, shape=[None, n_input]) 
y = tf.placeholder(dtype=tf.float32, shape=[None, n_classes]) 

# Network 
def LSTM(x): 
    W = tf.Variable(tf.random_normal([n_hidden, n_classes]), dtype=tf.float32) # weights 
    b = tf.Variable(tf.random_normal([n_classes]), dtype=tf.float32) # biases 

    x_shape = 92 

    x = tf.transpose(x) 
    x = tf.reshape(x, [-1, n_input]) 
    x = tf.split(x, x_shape) 

    lstm = rnn.BasicLSTMCell(
     num_units=n_hidden, 
     forget_bias=1.0 
    ) 
    outputs, states = rnn.static_rnn(
     cell=lstm, 
     inputs=x, 
     dtype=tf.float32 
    ) 

    output = tf.matmul(outputs[-1], W) + b 

    return output 

# Train Network 
def train(x): 
    prediction = LSTM(x) 

    with tf.Session() as sess: 
     sess.run(tf.global_variables_initializer()) 
     output = sess.run(prediction, feed_dict={"x": train_x}) 
     print(output) 

train(x) 

我沒有得到任何錯誤,但我餵養大小92的輸入張量,並且在LSTM函數矩陣乘法返回包含一個列表一個結果向量,當期望的數量是92時,每個輸入一個結果向量。

問題是矩陣只乘以輸出數組中的最後一項?就像這樣:

output = tf.matmul(outputs[-1], W) + b 

代替:

output = tf.matmul(outputs, W) + b 

這是我收到的時候我做了後者的錯誤:

ValueError: Shape must be rank 2 but is rank 3 for 'MatMul' (op: 'MatMul') with input shapes: [92,?,128], [128,20]. 

回答

0

static_rnn製作最簡單的迴歸神經網絡。 Here's the tf documentation。所以它的輸入應該是一個張量序列。假設你想輸入4個單詞,分別叫「你好」,「如何」,「是」,「你」。所以你的輸入位置持有者應該包含四個n(每個輸入向量的大小)與每個單詞相對應的維向量。

我認爲你的佔位符有問題。您應該使用RNN的輸入數來初始化它。 28是每個矢量中的維數。我相信92是序列的長度。 (更像92 lstm單元格)

在輸出列表中,您將得到一組等於序列長度的向量,每個序列的長度等於隱藏單元的數量。