2016-11-12 65 views
0

我刚开始学习tensorflow,并试图构建一个简单的rnn。以下是您需要重现我遇到的问题的所有代码。tensorflow - 为什么BasicRNNCell的矩阵形状不等于(n_hidden x n_input)?

tf.reset_default_graph() 
rnn = tf.nn.rnn_cell.BasicRNNCell(110, 
            activation=tf.sigmoid) 
x = tf.placeholder(tf.float32, shape=[20, 5, 2], name='x') 
xt = tf.transpose(x) 
x_split = [x_temp[:,0,:] for x_temp in tf.split(1, 5, xt)[::-1]] 
h_list, _ = tf.nn.rnn(rnn, x_split, dtype=tf.float32) 

tf.all_variables()[0].get_shape() 
# TensorShape([Dimension(130), Dimension(110)]) 
x_split 
# [<tf.Tensor 'Squeeze:0' shape=(2, 20) dtype=float32>, 
# <tf.Tensor 'Squeeze_1:0' shape=(2, 20) dtype=float32>, 
# <tf.Tensor 'Squeeze_2:0' shape=(2, 20) dtype=float32>, 
# <tf.Tensor 'Squeeze_3:0' shape=(2, 20) dtype=float32>, 
# <tf.Tensor 'Squeeze_4:0' shape=(2, 20) dtype=float32>] 

为什么矩阵的维数?我希望它是20×110,由于输入具有尺寸20

tf.__version__ 
# 0.10.0rc0 

回答

1

BasicRNNCell具有以下力学(按照comment):

"""Most basic RNN: output = new_state = activation(W * input + U * state + B).""" 

可变RNN/BasicRNNCell/Linear/Matrix:0你检查大小是内部RNNCell变量,编码从状态到状态的转换。因此,它接受尺寸为20的输入和尺寸为110的前一个状态,并输出下一个尺寸为110的状态,因此它被编码为130 x 110矩阵。

换句话说,它将UW连接起来。

+0

这个人现在看起来很明显....我不敢相信我没有意识到...... – evan54