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_crop
和 tf.image.random_crop
。文档指出 stateless_random_crop
是确定性的(给定一粒种子总是 return 相同的作物)。然而,random_crop
有一个种子参数并且也是确定性的,有人会认为。这两个功能之间的实际区别是什么?我在任何地方都找不到有关 Tensorflow 中无状态的信息。
tf.image.stateless_random_crop
和 tf.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全局种子和操作种子都是设置。
- 全局种子使用
tf.random.set_seed(global_seed)
设置
- 操作种子是通过将种子参数传递给操作来设置的,即
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.Generator
和stateless_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)
在 tf 2.5 中,有两个用于裁剪图像的函数:tf.image.stateless_random_crop
和 tf.image.random_crop
。文档指出 stateless_random_crop
是确定性的(给定一粒种子总是 return 相同的作物)。然而,random_crop
有一个种子参数并且也是确定性的,有人会认为。这两个功能之间的实际区别是什么?我在任何地方都找不到有关 Tensorflow 中无状态的信息。
tf.image.stateless_random_crop
和 tf.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全局种子和操作种子都是设置。
- 全局种子使用
tf.random.set_seed(global_seed)
设置
- 操作种子是通过将种子参数传递给操作来设置的,即
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.Generator
和stateless_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)