具有可变迭代部分的 TensorFlow 图
TensorFlow graph with variable-iteration sections
我正在创建一个包含两部分的 TensorFlow 图:编码器和解码器;解码器之后是优化。编码器和解码器都是递归神经网络,注册分别依赖于可变长度的输入和目标序列。换句话说,如果输入序列有 5 个元素而目标序列有 6 个元素,则编码器必须有 5 个登记,而解码器必须有 6 个登记。我虽然可以通过在图表上方创建两个变量来完成此操作:
len_input = 1
len_target = 1
图中有代码:
graph = tf.Graph()
with graph.as_default():
...
# Encoder
for t in range(len_input):
...
# Decoder
for t in range(len_target):
...
然后当我 运行 一个会话时,我会相应地更新它们:
with sess = tf.Session(graph=graph):
tf.initialize_all_variables().run()
for step in range(num_batches):
input = en_data.pop()
len_input = input.shape[1]
target = fr_data.pop()
len_target = target.shape[1]
然而,这根本没有产生预期的结果。相反,该图只注册编码器和解码器一次,就像第一次编译图时一样。
在你告诉我我可以跨注册保存张量之前,我的问题是损失函数取决于解码器的输出,而解码器的输出又取决于编码器的输出。换句话说,优化器优化了编码器和解码器中的所有权重,这意味着它们都需要在一个图中。如果我要跨注册保存张量值,我需要为编码器和解码器创建两个单独的图表,因为两者的注册数量不必相同。
我对此很困惑。起初,我想有一个占位符,我将输入编码器和解码器的注册数量,但占位符本身是一个张量,因此不能在 for 的 range
函数中使用环形。我不知道我能做什么。有什么建议么?提前致谢! :)
TensorFlow 支持使用图中的控制流结构动态展开循环。您可以使用以下接口之一,而不是使用 Python for
循环来定义迭代,它允许您将循环主体定义为 Python 对象或函数:
如果您的编码器和解码器匹配 TensorFlow 的 tf.nn.rnn_cell.RNNCell
interface, you can use tf.nn.dynamic_rnn()
来定义具有不同时间步长的 RNN。 sequence_length
参数允许您将批处理中每个序列的长度指定为 tf.Tensor
,TensorFlow 将执行单元适当的次数。
如果循环体可以更容易地表示为 Python 函数,则可以使用 tf.while_loop()
or tf.scan()
高阶函数来定义循环。
我正在创建一个包含两部分的 TensorFlow 图:编码器和解码器;解码器之后是优化。编码器和解码器都是递归神经网络,注册分别依赖于可变长度的输入和目标序列。换句话说,如果输入序列有 5 个元素而目标序列有 6 个元素,则编码器必须有 5 个登记,而解码器必须有 6 个登记。我虽然可以通过在图表上方创建两个变量来完成此操作:
len_input = 1
len_target = 1
图中有代码:
graph = tf.Graph()
with graph.as_default():
...
# Encoder
for t in range(len_input):
...
# Decoder
for t in range(len_target):
...
然后当我 运行 一个会话时,我会相应地更新它们:
with sess = tf.Session(graph=graph):
tf.initialize_all_variables().run()
for step in range(num_batches):
input = en_data.pop()
len_input = input.shape[1]
target = fr_data.pop()
len_target = target.shape[1]
然而,这根本没有产生预期的结果。相反,该图只注册编码器和解码器一次,就像第一次编译图时一样。
在你告诉我我可以跨注册保存张量之前,我的问题是损失函数取决于解码器的输出,而解码器的输出又取决于编码器的输出。换句话说,优化器优化了编码器和解码器中的所有权重,这意味着它们都需要在一个图中。如果我要跨注册保存张量值,我需要为编码器和解码器创建两个单独的图表,因为两者的注册数量不必相同。
我对此很困惑。起初,我想有一个占位符,我将输入编码器和解码器的注册数量,但占位符本身是一个张量,因此不能在 for 的 range
函数中使用环形。我不知道我能做什么。有什么建议么?提前致谢! :)
TensorFlow 支持使用图中的控制流结构动态展开循环。您可以使用以下接口之一,而不是使用 Python for
循环来定义迭代,它允许您将循环主体定义为 Python 对象或函数:
如果您的编码器和解码器匹配 TensorFlow 的
tf.nn.rnn_cell.RNNCell
interface, you can usetf.nn.dynamic_rnn()
来定义具有不同时间步长的 RNN。sequence_length
参数允许您将批处理中每个序列的长度指定为tf.Tensor
,TensorFlow 将执行单元适当的次数。如果循环体可以更容易地表示为 Python 函数,则可以使用
tf.while_loop()
ortf.scan()
高阶函数来定义循环。