如何在张量流数据集的每次迭代中增加随机性?

时间:2019-10-24 17:24:30

标签: python tensorflow dataset

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

例如,我想在每次批量并将其馈送到Button时向数据集中的每个元素添加随机噪声。

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()) 读取的原始数据中添加随机性,但是数据不会在不同时期之间发生变化。

3 个答案:

答案 0 :(得分:1)

这段代码应该可以为您带来预期的结果

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

答案 1 :(得分:1)

您对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())

答案 2 :(得分:0)

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

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