如何在可变序列长度的张量流中创建递归神经网络?
How to create a recurrent neural network in tensor flow for variable sequence length?
我正在尝试在张量流中创建循环神经网络。网络的输入是一个向量序列。所有输入的序列长度都不同。我想用一批输入来做到这一点。
谁能帮我具体怎么做?看了tensorflow网站上的教程,还是不太清楚
这取决于你的数据集,但你可以这样做:
- 使用数据集中的最大长度,或者
- 使用合理的大小(例如 256),如果输入数据长于该大小,则将其拆分为该大小。
可以使用定义的rnn函数here
它接受的参数之一是sequence_length
sequence_length: Specifies the length of each sequence in inputs.
An int32 or int64 vector (tensor) size [batch_size]. Values in [0, T).
下面是实现完整循环的方法
# x, state, sequence_length are placeholders
outputs, final_state = tf.nn.rnn(lstm_cell, x, state, sequence_length = sequence_lengths)
# add softmax layer, define loss, training method, etc
...
# code for one epoch
iterations = total_data_length / batch_size
max_sequence_length = max(all_possible_sequence_lengths)
cur_state = initial_state
for i in range(iterations):
# x is of dimension [max_sequence_length, batch_size, input_size]
# sequence_lengths is of dimension [batch_size]
x_data, sequence_data, y_data = mini_batch(batch_size)
feed_dict = {k: v for k, v in zip(x, x_data)}
feed_dict.append(sequence_lengths: sequence_data, ...)
outs, cur_state, _ = session.run([outputs, final_state, train], feed_dict)
由于以下几个原因,这种方法让我有点困惑:
- 输入形状是 [sequence_length、batch_size、input_size] 而不是 [batch_size、sequence_length、input_size]。但是,如果您仔细阅读代码并查看 rnn() 是如何实现的,那么这完全是有道理的。这也意味着您需要重塑输出(具有与输入相同的维度),以便将它们传递给 matmul,然后传递给 softmax。
- 函数 rnn() 中的参数输入是一个 python 列表。而且你不能在 feed_dict 中将其作为 {x: x_data} 传递,你会收到一条错误消息 "Not able to hash type: 'list'"。相反,看看我是如何在上面的代码中使用理解的。
我正在尝试在张量流中创建循环神经网络。网络的输入是一个向量序列。所有输入的序列长度都不同。我想用一批输入来做到这一点。
谁能帮我具体怎么做?看了tensorflow网站上的教程,还是不太清楚
这取决于你的数据集,但你可以这样做:
- 使用数据集中的最大长度,或者
- 使用合理的大小(例如 256),如果输入数据长于该大小,则将其拆分为该大小。
可以使用定义的rnn函数here
它接受的参数之一是sequence_length
sequence_length: Specifies the length of each sequence in inputs. An int32 or int64 vector (tensor) size [batch_size]. Values in [0, T).
下面是实现完整循环的方法
# x, state, sequence_length are placeholders
outputs, final_state = tf.nn.rnn(lstm_cell, x, state, sequence_length = sequence_lengths)
# add softmax layer, define loss, training method, etc
...
# code for one epoch
iterations = total_data_length / batch_size
max_sequence_length = max(all_possible_sequence_lengths)
cur_state = initial_state
for i in range(iterations):
# x is of dimension [max_sequence_length, batch_size, input_size]
# sequence_lengths is of dimension [batch_size]
x_data, sequence_data, y_data = mini_batch(batch_size)
feed_dict = {k: v for k, v in zip(x, x_data)}
feed_dict.append(sequence_lengths: sequence_data, ...)
outs, cur_state, _ = session.run([outputs, final_state, train], feed_dict)
由于以下几个原因,这种方法让我有点困惑:
- 输入形状是 [sequence_length、batch_size、input_size] 而不是 [batch_size、sequence_length、input_size]。但是,如果您仔细阅读代码并查看 rnn() 是如何实现的,那么这完全是有道理的。这也意味着您需要重塑输出(具有与输入相同的维度),以便将它们传递给 matmul,然后传递给 softmax。
- 函数 rnn() 中的参数输入是一个 python 列表。而且你不能在 feed_dict 中将其作为 {x: x_data} 传递,你会收到一条错误消息 "Not able to hash type: 'list'"。相反,看看我是如何在上面的代码中使用理解的。