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