gpt4 book ai didi

python - Tensorflow:使用 tf.mat_fn() 或 tf.nn.dynamic_rnn() 在 LSTM 之前应用层有什么区别?

转载 作者:行者123 更新时间:2023-11-28 18:26:37 29 4
gpt4 key购买 nike

这个问题是关于使用 Tensorflow 的编码策略。我想创建一个由以下内容组成的小型分类器网络:

  • 1:一个输入
  • 2:一个简单的全连接层(W*x+B)
  • 3:一个LSTM层
  • 4:一个softmax层
  • 5:一个输出

在 tensorflow 中,要使用类 tf.nn.dynamic_rnn(),我们需要将一批序列发送到网络。到目前为止,它运行良好(我喜欢这个库)。

但是因为我想在我的序列的每个特征上应用一个简单的层(在我的描述中是第二层),我想知道:

  • 我是否在我的 LSTM 层之前使用这个简单的层并将两者都传递给 tf.nn.dynamic_rnn()操作...

  • 我是否使用函数 tf.map_fn()两次(一次用于解压批处理,一次用于解压序列),如果理解得当,就能够解压我的序列并在每个特征线上应用一层。

通常,它应该给我相同的结果?如果是这样,我应该使用什么?

感谢您的宝贵时间!

最佳答案

我最近遇到了类似的情况,我想链接循环层和非循环层。

Do i preceed my LSTM layer with this simple layer and pass both to the tf.nn.dynamic_rnn() operation...

这行不通。函数 dynamic_rnn 需要一个单元格作为它的第一个参数。单元格是继承自 tf.nn.rnn_cell.RNNCell 的类。此外,dynamic_rnn 的第二个输入参数应该是至少具有 3 个维度的张量,其中前两个维度是批处理和时间 (time_major=False) 或时间和批处理(time_major=True)。

Do i use the function tf.map_fn() twice (one to unpack batches, one to unpack sequences), which if a understood well, is able to unpack my sequences and apply a layer on each features line.

这可能会奏效,但在我看来这不是一个高效且干净的解决方案。首先,没有必要“解包批处理”,因为您可能想对特征批处理和时间步长执行一些操作,其中批处理中的每个观察值都独立于其他观察值。

我对这个特定问题的解决方案是创建 tf.nn.rnn_cell.RNNCell 的子类。在我的例子中,我想要一个简单的前馈层,它会迭代所有的时间步长,并且可以在 dynamic_rnn 中使用:

import tensorflow as tf

class FeedforwardCell(tf.nn.rnn_cell.RNNCell):
"""A stateless feedforward cell that can be used with MultiRNNCell
"""
def __init__(self, num_units, activation=tf.tanh, dtype=tf.float32):
self._num_units = num_units
self._activation = activation
# Store a dummy state to make dynamic_rnn happy.
self.dummy = tf.constant([[0.0]], dtype=dtype)

@property
def state_size(self):
return 1

@property
def output_size(self):
return self._num_units

def zero_state(self, batch_size, dtype):
return self.dummy

def __call__(self, inputs, state, scope=None):
"""Basic feedforward: output = activation(W * input)."""
with tf.variable_scope(scope or type(self).__name__): # "FeedforwardCell"
output = self._activation(tf.nn.rnn_cell._linear(
[inputs], self._num_units, True))
return output, self.dummy

此类的实例可以在具有“正常”RNN 单元的列表中传递给 tf.nn.rnn_cell.MultiRNNCell 初始化器。生成的对象实例可以作为 cell 输入参数传递给 dynamic_rnn

重要提示:dynamic_rnn 期望循环单元格在调用时返回一个状态。因此,我在 FeedforwardCell 中使用 dummy 作为假状态变量。

我的解决方案可能不是将循环层和非循环层链接在一起的最流畅或最佳方式。我有兴趣听取其他 Tensorflow 用户的建议。

编辑如果您选择使用 dynamic_rnnsequence_length 输入参数,则 state_size 应该是 self._num_units 并且 dummy 状态的形状应该是 [batch_size, self.state_size]。换句话说,状态不能是标量。请注意,bidirectional_dynamic_rnn 要求 sequence_length 参数不是None,而 dynamic_rnn 没有此要求。 (这在 TF 文档中记录得很薄弱。)

关于python - Tensorflow:使用 tf.mat_fn() 或 tf.nn.dynamic_rnn() 在 LSTM 之前应用层有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40887570/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com