【问题标题】:Iterate over a tensor dimension in Tensorflow迭代 Tensorflow 中的张量维度
【发布时间】:2018-09-04 15:28:18
【问题描述】:

我正在尝试从低层次的角度开发一个 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>

【问题讨论】:

  • 只是一个猜测,但我认为 tensorflow 使用 numpy 数组来做这种事情,所以我会查看 numpy 文档。
  • 您能否在an example 上发布您所拥有的以及您想获得的确切信息?
  • 我虽然也一样,但这根本行不通。我之前尝试通过np.asarray 传递张量,但它无法将张量识别为数组

标签: python tensorflow


【解决方案1】:

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 之类的东西来为你做样板文件。

【讨论】:

  • 我考虑了 max_size 的选项,但是,它似乎不是很好的性能,我希望 tensorflow 有更好的选择。我错了吗?
  • @ÁngelDelgadoPaandero tf.nn.dynamic_rnn 可以提前停止。但是,如果您有一个批次,您仍然需要覆盖批次中最长的序列。如果您使批次具有相似的序列长度,则效果最佳。在谈论表演之前,先尝试最简单的事情,看看它是如何工作的。可能是它足够快。
  • 我理解你的观点,但这不仅仅是性能问题,我不敢相信没有方法可以迭代张量的维度。我会让每一个低级程序都变得困难
【解决方案2】:

最后我找到了解决我的问题的方法。它使用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')

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2018-11-11
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多