小编Jam*_*mon的帖子

Tensorflow build() 如何从 tf.keras.layers.Layer 工作

我想知道是否有人知道该build()函数tf.keras.layers.Layer在幕后的类中是如何工作的。根据文档

当您知道输入张量的形状并可以完成其余的初始化工作时,将调用 build

所以对我来说,这门课的行为似乎与此类似:

class MyDenseLayer:
  def __init__(self, num_outputs):
    self.num_outputs = num_outputs

  def build(self, input_shape):
    self.kernel = self.add_weight("kernel",
                                  shape=[int(input_shape[-1]), self.num_outputs])

  def __call__(self, input):
    self.build(input.shape) ## build is called here when input shape is known
    return tf.matmul(input, self.kernel)
Run Code Online (Sandbox Code Playgroud)

我无法想象build()会被永远调用__call__,但它是唯一传入输入的地方。有谁知道这到底是如何工作的?

python keras tensorflow

10
推荐指数
1
解决办法
1353
查看次数

关于 .shuffle、.batch 和 .repeat 的 Tensorflow 数据集问题

我有一个关于使用 tf.Dataset 使用批处理、重复和随机播放的问题。

我不清楚如何使用重复和随机播放。据我所知,.batch将决定许多训练实例将如何进行随机梯度下降,的用途.repeat.shuffle仍然不清晰。

第一个问题

即使在查看herehere 之后.repeat也用于在tf.errors.OutOfRangeError抛出a 后重复数据集。因此,在我的代码中,这是否意味着我不再需要实现:

try:
    while True:
        _ = sess.run(self.optimizer)

except tf.errors.OutOfRangeError:
        pass
Run Code Online (Sandbox Code Playgroud)

因为.repeat一旦数据集耗尽会自动重复数据集?什么时候停止?或者它永远不会停止,一旦经过一定数量的批次(例如 1000),您就必须退出 while True 循环?

第二个问题

其次,使用.shuffle对我来说没有意义。是否.shuffle.batch()意味着我有,比方说,10万个样本,把1000随机在一个缓冲区.shuffle,再批量说,他们的100 .batch()。根据我的理解,下一批将使用这些样本中的 999 个,并在缓冲区中放置 1 个新样本。那么如果我的样品对它们没有顺序,那么.shuffle应该一起避免吗?如果.batch使用,它仍然会从缓冲区中的 999+1 中批处理 100?

第三个问题

最后,如果我使用单独的td.dataset对象进行测试,.shuffle.batch()我应该考虑什么顺序?现在我使用:

sess.run(self.test_init)
try:
    while True:
        accuracy_batch = sess.run(self.accuracy)

except tf.errors.OutOfRangeError:
    pass
Run Code Online (Sandbox Code Playgroud)

和:

test_data = self.test_dataset.shuffle(self.batch_size).batch(self.batch_size)
Run Code Online (Sandbox Code Playgroud)

我有超过 …

python tensorflow tensorflow-datasets

5
推荐指数
1
解决办法
2197
查看次数

时间序列分析中的 tf.data.dataset 批处理

我正在考虑为时间序列 LSTM 模型创建管道。我有两个输入提要,我们称它们为series1series2

tf.data通过调用来初始化对象from.tensor.slices

ds = tf.data.Dataset.from_tensor_slices((series1, series2))
Run Code Online (Sandbox Code Playgroud)

我将它们进一步批处理到设定窗口大小的窗口中,并在窗口之间移动 1:

ds = ds.window(window_size + 1, shift=1, drop_remainder=True)
Run Code Online (Sandbox Code Playgroud)

此时我想尝试一下它们是如何批处理在一起的。我想生成如下所示的特定输入作为示例:

series1 = [1, 2, 3, 4, 5]
series2 = [100, 200, 300, 400, 500]

batch 1: [1, 2, 100, 200]
batch 2: [2, 3, 200, 300]
batch 3: [3, 4, 300, 400]
Run Code Online (Sandbox Code Playgroud)

因此,每个批次将返回Series1的两个元素,然后返回Series2的两个元素。此代码片段无法单独批处理它们:

ds = ds.map(lambda s1, s2: (s1.batch(window_size + 1), s2.batch(window_size + 1))
Run Code Online (Sandbox Code Playgroud)

因为它返回数据集对象的两个映射。由于它们是对象,因此它们不可订阅,因此这也不起作用:

ds = ds.map(lambda s1, s2: (s1[:2], s2[:2])) …
Run Code Online (Sandbox Code Playgroud)

python keras tensorflow tensorflow-datasets tensorflow2.0

5
推荐指数
1
解决办法
1710
查看次数