如何设置tf.keras.layers.RandomFlip实现每次调用均对图像执行翻转操作
问题原因
tf.keras.layers.RandomFlip的定位是随机数据增强层,默认对每张输入图像以50%的概率执行翻转操作,剩余50%概率保留原图,这个逻辑和seed参数无关——seed仅用于固定随机选择的结果,保证不同次运行时翻转的样本选择可复现,无论设置什么seed值都无法让所有输入都被翻转。
解决方案(所有输入每次调用强制全部翻转)
直接使用tf.image的翻转API封装为自定义层即可,根据你需要的翻转模式选择对应代码替换原有RandomFlip层即可:
- 同时水平+垂直翻转所有图像(对应你原本的
HORIZONTAL_AND_VERTICAL模式):
flip_layer = tf.keras.layers.Lambda(lambda x: tf.image.flip_left_right(tf.image.flip_up_down(x)))
- 仅水平翻转所有图像:
flip_layer = tf.keras.layers.Lambda(lambda x: tf.image.flip_left_right(x))
- 仅垂直翻转所有图像:
flip_layer = tf.keras.layers.Lambda(lambda x: tf.image.flip_up_down(x))
特殊场景适配:单批次内所有图像翻转状态统一
如果你的需求是每次调用时整批图像要么全部翻转、要么全部不翻转(批次内翻转状态一致,保留整体随机逻辑但不会出现同批次部分翻部分不翻的情况),可以用以下自定义层实现:
class BatchRandomFlip(tf.keras.layers.Layer): def __init__(self, mode="HORIZONTAL_AND_VERTICAL", **kwargs): super().__init__(**kwargs) self.mode = mode def call(self, inputs, training=True): if not training: return inputs # 生成批次级的随机判断,整批统一执行 flip_prob = tf.random.uniform(shape=()) if flip_prob >= 0.5: if self.mode == "HORIZONTAL": return tf.image.flip_left_right(inputs) elif self.mode == "VERTICAL": return tf.image.flip_up_down(inputs) elif self.mode == "HORIZONTAL_AND_VERTICAL": return tf.image.flip_left_right(tf.image.flip_up_down(inputs)) return inputs
内容的提问来源于stack exchange,提问作者Roshan Kaleem
相关产品推荐
相关产品推荐

