tf.image.stateless_random_crop 比。 tf.image.random_crop。这些不应该是一回事吗?

tf.image.stateless_random_crop VS. tf.image.random_crop. Shouldn't these be the same thing?

在 tf 2.5 中,有两个用于裁剪图像的函数:tf.image.stateless_random_croptf.image.random_crop。文档指出 stateless_random_crop 是确定性的(给定一粒种子总是 return 相同的作物)。然而,random_crop 有一个种子参数并且也是确定性的,有人会认为。这两个功能之间的实际区别是什么?我在任何地方都找不到有关 Tensorflow 中无状态的信息。

tf.image.stateless_random_croptf.image.random_crop 之间的区别在于使用 stateless_random_uniform 而不是 random_uniform 的一行: stateless_random_crop: https://github.com/tensorflow/tensorflow/blob/v2.5.0/tensorflow/python/ops/random_ops.py#L415-L465 random_crop: https://github.com/tensorflow/tensorflow/blob/v2.5.0/tensorflow/python/ops/random_ops.py#L360-L412

我一直认为 random_crop 总是会 return 给定种子的相同作物,但看起来也许并非总是如此?非常感谢任何有关 Tensorflow 中无状态的启示!

random_crop总是return只有当both全局种子操作种子都是设置。

  1. 全局种子使用 tf.random.set_seed(global_seed)
  2. 设置
  3. 操作种子是通过将种子参数传递给操作来设置的,即tf.image.random_crop(value, size, seed=ops_seed)

stateless_random_crop returns 完全由您在设备和 tensorflow 版本不变的情况下传递给它的种子决定。

你是对的,这些函数看起来冗余且重复,但实际上 tf.image.random_crop 来自旧的 RNG API 并且它在图形模式下可能存在错误。新的 RNG API 是 tf.random.Generator 和无状态的 RNG。有关详细信息,请参阅 https://www.tensorflow.org/guide/random_numbers

结合使用tf.random.Generatorstateless_random_crop

class new_RNGs_random_crop:
  def __init__(self,seed,size):
    self.rand_generator=tf.random.Generator.from_seed(seed)
    self.size=size
  def random_crop(self,x):
    return tf.image.stateless_random_crop(x,self.size,
           seed=self.rand_generator.uniform_full_int([2],dtype=tf.int32))

dummy_dataset=tf.data.Dataset.from_tensor_slices(np.arange(2*3*3).reshape((2,3,3))).batch(1)
cropper=new_RNGs_random_crop(88883,(1,2,2))
dummy_dataset=dummy_dataset.map(cropper.random_crop)

for image in dummy_dataset:
  print(image)

示例输出:

tf.Tensor(
[[[3 4]
  [6 7]]], shape=(1, 2, 2), dtype=int64)
tf.Tensor(
[[[ 9 10]
  [12 13]]], shape=(1, 2, 2), dtype=int64)