有没有办法构建一个随机旋转指定角度的keras预处理层?
Is there a way to build a keras preprocessing layer that randomly rotates at specified angles?
我正在从事一个天文图像分类项目,我目前正在使用 keras 构建 CNN。
我正在尝试构建预处理管道以使用 keras/tensorflow 层扩充我的数据集。为了简单起见,我想实现 dihedral group (i.e., for square images, 90-degrees rotations and flips), but it seems that tf.keras.preprocessing.image.random_rotation 的随机变换,只允许在均匀分布后连续选择范围内的随机度。
我想知道是否有一种方法可以从指定学位列表中进行选择,在我的例子中是 [0, 90, 180, 270]。
幸运的是,有一个 tensorflow 函数可以满足您的需求:tf.image.rot90
。下一步是将该函数包装到自定义 PreprocessingLayer
中,因此它会随机执行。
import tensorflow as tf
import tensorflow.keras.backend as K
from tensorflow.keras.layers.experimental.preprocessing import PreprocessingLayer
class RandomRot90(PreprocessingLayer):
def __init__(self, name=None, **kwargs) -> None:
super(RandomRot90, self).__init__(name=name, **kwargs)
self.input_spec = tf.keras.layers.InputSpec(ndim=4)
def call(self, inputs, training=True):
if training is None:
training = K.learning_phase()
def random_rot90():
# random int between 0 and 3
rot = tf.random.uniform((),0,4, dtype=tf.int32)
return tf.image.rot90(inputs, k=rot)
# if not training, do nothing
outputs = tf.cond(training, random_rot90, lambda:inputs)
outputs.set_shape(inputs.shape)
return outputs
def compute_output_shape(self, input_shape):
return input_shape
- 请注意,如果您希望能够使用该层保存和加载模型,您可能需要实施
get_config
。 (见documentation)
- 另请注意,如果您的输入不是正方形(高度!=宽度),该层可能会失败。
我正在从事一个天文图像分类项目,我目前正在使用 keras 构建 CNN。
我正在尝试构建预处理管道以使用 keras/tensorflow 层扩充我的数据集。为了简单起见,我想实现 dihedral group (i.e., for square images, 90-degrees rotations and flips), but it seems that tf.keras.preprocessing.image.random_rotation 的随机变换,只允许在均匀分布后连续选择范围内的随机度。
我想知道是否有一种方法可以从指定学位列表中进行选择,在我的例子中是 [0, 90, 180, 270]。
幸运的是,有一个 tensorflow 函数可以满足您的需求:tf.image.rot90
。下一步是将该函数包装到自定义 PreprocessingLayer
中,因此它会随机执行。
import tensorflow as tf
import tensorflow.keras.backend as K
from tensorflow.keras.layers.experimental.preprocessing import PreprocessingLayer
class RandomRot90(PreprocessingLayer):
def __init__(self, name=None, **kwargs) -> None:
super(RandomRot90, self).__init__(name=name, **kwargs)
self.input_spec = tf.keras.layers.InputSpec(ndim=4)
def call(self, inputs, training=True):
if training is None:
training = K.learning_phase()
def random_rot90():
# random int between 0 and 3
rot = tf.random.uniform((),0,4, dtype=tf.int32)
return tf.image.rot90(inputs, k=rot)
# if not training, do nothing
outputs = tf.cond(training, random_rot90, lambda:inputs)
outputs.set_shape(inputs.shape)
return outputs
def compute_output_shape(self, input_shape):
return input_shape
- 请注意,如果您希望能够使用该层保存和加载模型,您可能需要实施
get_config
。 (见documentation) - 另请注意,如果您的输入不是正方形(高度!=宽度),该层可能会失败。