Tensorflow RNN 输出张量形状
Tensorflow RNN output tensor shapes
我对 tensorflow 很陌生,我不太了解如何塑造张量以便将输出作为单个数字获得。基本上,我的循环网络应该猜测下一个数字。相反,对于每个预测它 returns 我一个包含五个数字的列表?我想我的一个或多个张量变形了。
我的输入数据被格式化为大约 2000 个列表,每个列表有 5 个特征,如下所示:
[
np.array ([
[1],[2],[3],[4],[5]
])
]
这是 RNN 的代码:
cell_units = 400
batch_size = 5
no_of_epochs = 500
data = tf.placeholder (tf.float32, [None, 5, 1])
target = tf.placeholder (tf.float32, [None, 1, 1])
weight = tf.Variable (tf.random_normal ([cell_units, 5, 1]))
bias = tf.Variable (tf.random_normal([1, 1]))
cell = tf.contrib.rnn.BasicRNNCell (num_units = cell_units)
output, states = tf.nn.dynamic_rnn (cell, data, dtype=tf.float32)
output = tf.transpose (output, [1, 0, 2])
activation = tf.matmul (output, weight) + bias
cost = tf.reduce_mean (
(
tf.log (tf.square (activation - target))
)
)
optimizer = tf.train.AdamOptimizer (learning_rate = 0.01).minimize(cost)
with tf.Session () as sess:
sess.run (tf.global_variables_initializer ())
no_of_batches = int (len (train_x) / batch_size)
for i in range(no_of_epochs):
start = 0
for j in range(no_of_batches):
inp = train_x [start:start+batch_size]
out = train_y [start:start+batch_size]
start += batch_size
sess.run (optimizer, {data: inp, target: out})
tf.nn.dynamic_rnn
需要形状为 [batch_size, max_time, ...]
的输入。在您的示例中,batch_size
是动态的(即未知),max_time
是 5
(即时间步数)。自然地,RNN 的输出包含 5
个条目,每个输入步骤一个:[None, 5, cell_units]
.
正如@Ishant Mrinal 所建议的那样,您可以 select 最后一个输出步骤。
weight = tf.Variable (tf.random_normal ([cell_units, 1]))
bias = tf.Variable (tf.random_normal([1, 1]))
cell = tf.contrib.rnn.BasicRNNCell (num_units = cell_units)
output, states = tf.nn.dynamic_rnn (cell, data, dtype=tf.float32)
# Get the last step (4th index).
output = tf.squeeze(tf.transpose (output, [0, 2, 1])[:,:,4]) # Shape of [batch_size, cell_units].
activation = tf.matmul (output, weight) + bias
activation
的形状为 [batch_size, 1]
.
我对 tensorflow 很陌生,我不太了解如何塑造张量以便将输出作为单个数字获得。基本上,我的循环网络应该猜测下一个数字。相反,对于每个预测它 returns 我一个包含五个数字的列表?我想我的一个或多个张量变形了。
我的输入数据被格式化为大约 2000 个列表,每个列表有 5 个特征,如下所示:
[
np.array ([
[1],[2],[3],[4],[5]
])
]
这是 RNN 的代码:
cell_units = 400
batch_size = 5
no_of_epochs = 500
data = tf.placeholder (tf.float32, [None, 5, 1])
target = tf.placeholder (tf.float32, [None, 1, 1])
weight = tf.Variable (tf.random_normal ([cell_units, 5, 1]))
bias = tf.Variable (tf.random_normal([1, 1]))
cell = tf.contrib.rnn.BasicRNNCell (num_units = cell_units)
output, states = tf.nn.dynamic_rnn (cell, data, dtype=tf.float32)
output = tf.transpose (output, [1, 0, 2])
activation = tf.matmul (output, weight) + bias
cost = tf.reduce_mean (
(
tf.log (tf.square (activation - target))
)
)
optimizer = tf.train.AdamOptimizer (learning_rate = 0.01).minimize(cost)
with tf.Session () as sess:
sess.run (tf.global_variables_initializer ())
no_of_batches = int (len (train_x) / batch_size)
for i in range(no_of_epochs):
start = 0
for j in range(no_of_batches):
inp = train_x [start:start+batch_size]
out = train_y [start:start+batch_size]
start += batch_size
sess.run (optimizer, {data: inp, target: out})
tf.nn.dynamic_rnn
需要形状为 [batch_size, max_time, ...]
的输入。在您的示例中,batch_size
是动态的(即未知),max_time
是 5
(即时间步数)。自然地,RNN 的输出包含 5
个条目,每个输入步骤一个:[None, 5, cell_units]
.
正如@Ishant Mrinal 所建议的那样,您可以 select 最后一个输出步骤。
weight = tf.Variable (tf.random_normal ([cell_units, 1]))
bias = tf.Variable (tf.random_normal([1, 1]))
cell = tf.contrib.rnn.BasicRNNCell (num_units = cell_units)
output, states = tf.nn.dynamic_rnn (cell, data, dtype=tf.float32)
# Get the last step (4th index).
output = tf.squeeze(tf.transpose (output, [0, 2, 1])[:,:,4]) # Shape of [batch_size, cell_units].
activation = tf.matmul (output, weight) + bias
activation
的形状为 [batch_size, 1]
.