【问题标题】:tf.image.stateless_random_crop VS. tf.image.random_crop. Shouldn't these be the same thing?tf.image.stateless_random_crop VS。 tf.image.random_crop。这些不应该是一样的吗?
【发布时间】:2021-07-18 17:39:57
【问题描述】:

在 tf 2.5 中,有两个用于裁剪图像的函数:tf.image.stateless_random_croptf.image.random_crop。文档指出stateless_random_crop 是确定性的(总是返回给定一颗种子的相同作物)。但是,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 随机裁剪:https://github.com/tensorflow/tensorflow/blob/v2.5.0/tensorflow/python/ops/random_ops.py#L360-L412

我一直认为random_crop 总是会在给定种子的情况下返回相同的作物,但看起来可能并非总是如此?非常感谢任何关于 Tensorflow 中无状态的启示!

【问题讨论】:

    标签: python tensorflow tensorflow2.0 tensorflow-datasets


    【解决方案1】:

    random_crop 只有在设置了全局种子操作种子时才会返回相同的作物序列。

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

    stateless_random_crop 返回的内容完全取决于您在设备和 tensorflow 版本不变时传递给它的种子。

    你说得对,这些函数看起来是多余的和重复的,但实际上 tf.image.random_crop 来自旧的 RNGs 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-17
      • 2019-03-04
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多