我正在尝试从低层次角度开发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>
答案 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_rnn
或tf.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')