【问题标题】:How to add randomness in each iteration of tensorflow DataSet?如何在 tensorflow DataSet 的每次迭代中添加随机性?
【发布时间】:2020-02-21 02:08:30
【问题描述】:

我正在使用 Estimator API。我想通过DataSet 在每次迭代中动态处理每个小批量(或每个元素)。

例如,我想在每次对数据集中的每个元素进行批处理并输入model_fn 时为其添加随机噪声。

dataset.map() 似乎只被调用一次,随后通过dataset.repeat() 的传递是静态的。这是我尝试过的:

import tensorflow as tf
import numpy as np
import random 

dx = tf.data.Dataset.from_tensor_slices([10.0, 20.0, 30.0])
dx = dx.map(lambda x: x + random.uniform(0, 1)).repeat(2)
for next_element in dx:
    print(next_element.numpy())

输出

10.426203
20.426203
30.426203
10.426203
20.426203
30.426203

一种方法是为input_fn 读取的原始数据添加随机性,但随后数据不会在不同时期之间发生变化。

【问题讨论】:

    标签: python tensorflow dataset


    【解决方案1】:

    我能想到的一种解决方法是先生成噪声,然后使用重复的数据集进行压缩。也许还有其他更好的解决方案。

    import tensorflow as tf
    import numpy as np
    import random 
    
    dx = tf.data.Dataset.from_tensor_slices(np.array([10.0, 20.0, 30.0]))
    noise = tf.data.Dataset.from_tensor_slices(np.random.randn(6))
    dx = dx.repeat(2)
    new_dx = tf.data.Dataset.zip((dx, noise))
    for next_element in new_dx:
        data = next_element[0]
        ns = next_element[1]
        input_ = data+ns
        print(input_.numpy())
    
    # 10.969622987669728
    # 19.77313649149436
    # 30.09365081990082
    # 9.950256200151752
    # 19.36040356387037
    # 29.6192768988015
    

    【讨论】:

      【解决方案2】:

      这段代码应该会给你想要的结果

      import tensorflow as tf
      import numpy as np
      import random 
      
      def add_noise(x):
          noise = tf.random.uniform(shape=(), minval=0, maxval=1)
          return x + noise
      
      dx = tf.data.Dataset.from_tensor_slices([10.0, 20.0, 30.0])
      dx = dx.map(add_noise).repeat(2)
      for next_element in dx:
          print(next_element.numpy())
      
      10.931375
      20.01276
      30.051556
      10.825275
      20.22412
      30.7365
      

      【讨论】:

        【解决方案3】:

        你对map函数的理解有些问题。 Map 函数将其内部的逻辑分别应用于每个元素,但数据集仅创建一次。 random.uniform(0, 1) 生成一个随机浮点值。因此,当您在 map 函数中使用 random.uniform() 时,将使用固定的数字浮点常量创建数据集。现在,每次这个相同的数字浮点数都会被添加到 map 函数内的每个元素中。

        要克服这个问题,您必须使用tf.random.uniform(),它将张量链接到数据集中。每次将 map 函数应用于生成不同随机值的每个元素时,都会评估此张量,尽管数据集仅创建一次。

        所以你的代码应该是:

        import tensorflow as tf
        import numpy as np
        import random
        
        dx = tf.data.Dataset.from_tensor_slices([10.0, 20.0, 30.0])
        dx = dx.map(lambda x: x + tf.random.uniform([], 0, 1)).repeat(2)
        for next_element in dx:
            print(next_element.numpy())
        

        【讨论】:

        • 感谢您的代码和解释。为了确保我理解正确,每次在图中调用 tf.random.uniform 张量时都会对其进行评估(因此生成一个新的随机数)。它的值不是在input_fn 中确定的,而是在计算过程中确定的。对吗?
        猜你喜欢
        • 2018-05-01
        • 1970-01-01
        • 2018-04-14
        • 2022-07-08
        • 1970-01-01
        • 2021-12-04
        • 2012-03-04
        • 1970-01-01
        相关资源
        最近更新 更多