在Tensorflow中迭代张量维度

时间:2018-03-26 13:07:30

标签: python tensorflow

我正在尝试从低层次角度开发seq2seq模型(由我自己创建所需的所有张量)。我试图用一系列向量作为二维张量来提供模型,但是,我不能在张量的一个维度上迭代以通过向量提取向量。有谁知道我可以做些什么来喂养一批载体然后逐个获取它们?

这是我的代码:

batch_size = 100
hidden_dim = 5
input_dim = embedding_dim
time_size = 5



input_sentence = tf.placeholder(dtype=tf.float64, shape=[embedding_dim,None], name='input')
output_sentence = tf.placeholder(dtype=tf.float64, shape=[embedding_dim,None], name='output')

input_array = np.asarray(input_sentence)
output_array = np.asarray(output_sentence)

gru_layer1 = GRU(input_array, input_dim, hidden_dim) #This is a class created by myself


for i in range(input_array.shape[-1]):
    word = input_array[:,i]
    previous_state = gru_encoder.h_t
    gru_layer1.forward_pass(previous_state,word)

这是我得到的错误

TypeError: Expected binary or unicode string, got <tf.Tensor 'input_7:0' shape=(10, ?) dtype=float64>

2 个答案:

答案 0 :(得分:0)

Tensorflow延迟执行。

你通常无法知道矢量有多大(信号中的文字,音频样本等等)。常见的做法是将其限制在一个相当大的值,然后使用空令牌填充较短的序列。

执行此操作后,您可以使用切片运算符选择时间切片的数据:

data = tf.placeholder(shape=(batch_size, max_size, numer_of_inputs))
....
for i in range(max_size):
  time_data = data[:, i, :]
  DoStuff(time_data)

还查找tf.transpose以交换批次和时间索引。在某些情况下,它可以帮助提高性能。

或者考虑像tf.nn.static_rnntf.nn.dynamic_rnn之类的东西来为你做样板文件。

答案 1 :(得分:0)

最后,我找到了解决问题的方法。它使用tf.scan()而不是循环工作,这不需要输入张量在第二维中具有定义的数字。因此,您需要准备好以前要解析的输入张量tf.san()。在我的例子中,这是代码:

batch_size = 100
hidden_dim = 5
input_dim = embedding_dim
time_size = 5



input_sentence = tf.placeholder(dtype=tf.float64, shape=[embedding_dim,None], name='input')
output_sentence = tf.placeholder(dtype=tf.float64, shape=[embedding_dim,None], name='output')

input_array = np.asarray(input_sentence)
output_array = np.asarray(output_sentence)

x_t = tf.transpose(input_array, [1, 0], name='x_t')

h_0 = tf.convert_to_tensor(h_0, dtype=tf.float64)
h_t_transposed = tf.scan(forward_pass, x_t, h_0, name='h_t_transposed')
h_t = tf.transpose(h_t_transposed, [1, 0], name='h_t')