Tensorflow:成本张量列表
Tensorflow: List of Tensors for Cost
我正在尝试在 Tensor Flow 中使用 LSTM。网上找了个教程,里面取了一组序列,objective函数由LSTM的最后一个输出和已知值组成。但是,我想让我的 objective 函数使用来自每个输出的信息。具体来说,我试图让 LSTM 学习序列集(即学习句子中单词中的所有字母)。:
cell = rnn_cell.BasicLSTMCell(num_units)
inputs = [tf.placeholder(tf.float32,shape=[batch_size,input_size]) for _ in range(seq_len)]
result = [tf.placeholder(tf.float32, shape=[batch_size,input_size]) for _ in range(seq_len)]
W_o = tf.Variable(tf.random_normal([num_units,input_size], stddev=0.01))
b_o = tf.Variable(tf.random_normal([input_size], stddev=0.01))
outputs, states = rnn.rnn(cell, inputs, dtype=tf.float32)
losses = []
for i in xrange(len(outputs)):
final_transformed_val = tf.matmul(outputs[i],W_o) + b_o
losses.append(tf.nn.softmax(final_transformed_val))
cost = tf.reduce_mean(losses)
这样做会导致错误:
TypeError: List of Tensors when single Tensor expected
我该如何解决这个问题? tf.reduce_mean()
是否接受张量值列表,或者是否有一些特殊的张量对象接受它们?
在您的代码中,losses
是一个 Python 列表。 TensorFlow 的 reduce_mean()
需要一个张量,而不是 Python 列表。
losses = tf.reshape(tf.concat(1, losses), [-1, size])
其中 size 是您要采用 softmax 的值的数量,应该可以满足您的需求。参见 concat()
但是,我在您的代码中注意到一件事似乎有点奇怪,即您有一个输入占位符列表,而 the TensorFlow Tutorial 中的代码使用 3 阶张量作为输入。您的输入是 2 阶张量的列表。我建议查看教程中的代码,因为它几乎完全符合您的要求。
该教程中的主要文件之一是 here。特别是,第 139 行是他们创建成本的地方。
关于您的输入,第 90 和 91 行是设置输入和目标占位符的位置。这两行的主要内容是整个序列在单个占位符而不是占位符列表中传递。
请参阅 ptb_word_lm.py 文件中的第 120 行,了解他们在哪里进行串联。
工作示例,检查 notebook:
import tensorflow as tf
from tensorflow.models.rnn import rnn, rnn_cell
print(tf.__version__)
#> 0.8.0
batch_size = 2
output_size = input_size = 2
seq_len = 10
num_units = 2
cell = rnn_cell.BasicLSTMCell(num_units)
inputs = [tf.placeholder(tf.float32, shape=[batch_size,input_size ]) for _ in xrange(seq_len)]
result = [tf.placeholder(tf.float32, shape=[batch_size,output_size]) for _ in xrange(seq_len)]
W_o = tf.Variable(tf.random_normal([num_units,input_size], stddev=0.01))
b_o = tf.Variable(tf.random_normal([input_size], stddev=0.01))
outputs, states = rnn.rnn(cell, inputs, dtype=tf.float32)
losses = []
for i in xrange(seq_len):
final_transformed_val = tf.matmul(outputs[i],W_o) + b_o
losses.append(tf.squared_difference(result[i],final_transformed_val))
losses = tf.reshape(tf.concat(1, losses), [-1, seq_len])
cost = tf.reduce_mean(losses)
要查看实际效果,您可以用一种 hacky 的方式提供图表:
import matplotlib.pyplot as plt
import numpy as np
step = tf.train.AdamOptimizer(learning_rate=0.01).minimize(cost)
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
costs = []
# EXAMPLE
# Learn cumsum over each sequence in x
# | t | 0 | 1 | 2 | 3 | 4 | ...|
# |----------|---|---|---|---|----|----|
# | x[:,0,0] | 1 | 1 | 1 | 1 | 1 | ...|
# | x[:,0,1] | 1 | 1 | 1 | 1 | 1 | ...|
# | | | | | | | |
# | y[:,0,0] | 1 | 2 | 3 | 4 | 5 | ...|
# | y[:,0,1] | 1 | 2 | 3 | 4 | 5 | ...|
n_iterations = 300
for _ in xrange(n_iterations):
x = np.random.uniform(0,1,[seq_len,batch_size,input_size])
y = np.cumsum(x,axis=0)
x_list = {key: value for (key, value) in zip(inputs, x)}
y_list = {key: value for (key, value) in zip(result, y)}
err,_ = sess.run([cost, step], feed_dict=dict(x_list.items()+y_list.items()))
costs.append(err)
plt.plot(costs)
plt.show()
作为 tensorflow 初学者,我还没有找到统一的 way/best 处理 RNN 的实践方法,但如上所述,我确信不推荐这样做。喜欢你的脚本作为一个非常好的介绍,感谢你的片段。另外,现在有 w.r.g 到 implementation of scan and RNN-tuple-friendliness 的事情,所以要小心
我正在尝试在 Tensor Flow 中使用 LSTM。网上找了个教程,里面取了一组序列,objective函数由LSTM的最后一个输出和已知值组成。但是,我想让我的 objective 函数使用来自每个输出的信息。具体来说,我试图让 LSTM 学习序列集(即学习句子中单词中的所有字母)。:
cell = rnn_cell.BasicLSTMCell(num_units)
inputs = [tf.placeholder(tf.float32,shape=[batch_size,input_size]) for _ in range(seq_len)]
result = [tf.placeholder(tf.float32, shape=[batch_size,input_size]) for _ in range(seq_len)]
W_o = tf.Variable(tf.random_normal([num_units,input_size], stddev=0.01))
b_o = tf.Variable(tf.random_normal([input_size], stddev=0.01))
outputs, states = rnn.rnn(cell, inputs, dtype=tf.float32)
losses = []
for i in xrange(len(outputs)):
final_transformed_val = tf.matmul(outputs[i],W_o) + b_o
losses.append(tf.nn.softmax(final_transformed_val))
cost = tf.reduce_mean(losses)
这样做会导致错误:
TypeError: List of Tensors when single Tensor expected
我该如何解决这个问题? tf.reduce_mean()
是否接受张量值列表,或者是否有一些特殊的张量对象接受它们?
在您的代码中,losses
是一个 Python 列表。 TensorFlow 的 reduce_mean()
需要一个张量,而不是 Python 列表。
losses = tf.reshape(tf.concat(1, losses), [-1, size])
其中 size 是您要采用 softmax 的值的数量,应该可以满足您的需求。参见 concat()
但是,我在您的代码中注意到一件事似乎有点奇怪,即您有一个输入占位符列表,而 the TensorFlow Tutorial 中的代码使用 3 阶张量作为输入。您的输入是 2 阶张量的列表。我建议查看教程中的代码,因为它几乎完全符合您的要求。
该教程中的主要文件之一是 here。特别是,第 139 行是他们创建成本的地方。 关于您的输入,第 90 和 91 行是设置输入和目标占位符的位置。这两行的主要内容是整个序列在单个占位符而不是占位符列表中传递。
请参阅 ptb_word_lm.py 文件中的第 120 行,了解他们在哪里进行串联。
工作示例,检查 notebook:
import tensorflow as tf
from tensorflow.models.rnn import rnn, rnn_cell
print(tf.__version__)
#> 0.8.0
batch_size = 2
output_size = input_size = 2
seq_len = 10
num_units = 2
cell = rnn_cell.BasicLSTMCell(num_units)
inputs = [tf.placeholder(tf.float32, shape=[batch_size,input_size ]) for _ in xrange(seq_len)]
result = [tf.placeholder(tf.float32, shape=[batch_size,output_size]) for _ in xrange(seq_len)]
W_o = tf.Variable(tf.random_normal([num_units,input_size], stddev=0.01))
b_o = tf.Variable(tf.random_normal([input_size], stddev=0.01))
outputs, states = rnn.rnn(cell, inputs, dtype=tf.float32)
losses = []
for i in xrange(seq_len):
final_transformed_val = tf.matmul(outputs[i],W_o) + b_o
losses.append(tf.squared_difference(result[i],final_transformed_val))
losses = tf.reshape(tf.concat(1, losses), [-1, seq_len])
cost = tf.reduce_mean(losses)
要查看实际效果,您可以用一种 hacky 的方式提供图表:
import matplotlib.pyplot as plt
import numpy as np
step = tf.train.AdamOptimizer(learning_rate=0.01).minimize(cost)
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
costs = []
# EXAMPLE
# Learn cumsum over each sequence in x
# | t | 0 | 1 | 2 | 3 | 4 | ...|
# |----------|---|---|---|---|----|----|
# | x[:,0,0] | 1 | 1 | 1 | 1 | 1 | ...|
# | x[:,0,1] | 1 | 1 | 1 | 1 | 1 | ...|
# | | | | | | | |
# | y[:,0,0] | 1 | 2 | 3 | 4 | 5 | ...|
# | y[:,0,1] | 1 | 2 | 3 | 4 | 5 | ...|
n_iterations = 300
for _ in xrange(n_iterations):
x = np.random.uniform(0,1,[seq_len,batch_size,input_size])
y = np.cumsum(x,axis=0)
x_list = {key: value for (key, value) in zip(inputs, x)}
y_list = {key: value for (key, value) in zip(result, y)}
err,_ = sess.run([cost, step], feed_dict=dict(x_list.items()+y_list.items()))
costs.append(err)
plt.plot(costs)
plt.show()
作为 tensorflow 初学者,我还没有找到统一的 way/best 处理 RNN 的实践方法,但如上所述,我确信不推荐这样做。喜欢你的脚本作为一个非常好的介绍,感谢你的片段。另外,现在有 w.r.g 到 implementation of scan and RNN-tuple-friendliness 的事情,所以要小心