2017-04-13 132 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单元格)

在输出列表中,您将得到一组等于序列长度的向量,每个序列的长度等于隐藏单元的数量。