首页 > 解决方案 > 如何将数据增强添加到回归问题?

问题描述

我正在尝试为具有 400 个样本大小的输入数据数量有限的回归问题构建 CNN 模型。输入是图像,标签是从 csv 文件的列中提取的。为了增加输入数据,我需要扩充输入图像并将它们与现有标签匹配。我正在使用旋转和翻转增强方法。我不确定现有标签应如何链接到增强图像,以及应如何创建最终的 tensorflow 数据集以适应模型。谁能帮我解决这个数据扩充问题?

#load csv file
labelPath =  "/content/drive/MyDrive/Notebook/tepm.csv"
cols = ["temperature"]
df = pd.read_csv(labelPath, sep=" ", header=None, names=cols)

inputPath='/content/drive/MyDrive/Notebook/test_png_64'
images = []

# Load in the images
for filepath in os.listdir(inputPath):
images.append(cv2.imread(inputPath+'/{0}'.format(filepath),flags=(cv2.IMREAD_ANYCOLOR | cv2.IMREAD_ANYDEPTH)))

images_scaled = np.array(images, dtype="float") / 255.0

(trainY, testY, trainX, testX) = train_test_split(df, images_scaled, test_size=0.20, random_state=42)

(trainY, valY, trainX, valX) = train_test_split(trainY, trainX, test_size=0.20, random_state=42)


def rotate(trainX: tf.Tensor) -> tf.Tensor:

    # Rotate 90 degrees
    return tf.image.rot90(trainX, tf.random_uniform(shape=[], minval=0, maxval=4, dtype=tf.float32))

def flip(trainX: tf.Tensor) -> tf.Tensor:
    trainX = tf.image.random_flip_left_right(trainX)
    trainX = tf.image.random_flip_up_down(trainX)

    return trainX

使用 ImageDataGenerator 更新

datagen = ImageDataGenerator(
        vertical_flip=True,
        horizontal_flip=True,
        fill_mode="nearest")

datagen.fit(trainX)

model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.0001), loss='mean_squared_error', metrics='mse')

标签: pythontensorflowkerasconv-neural-networkdata-augmentation

解决方案


最初,您应该考虑保留标签的增强是否有用,或者需要匹配标签增强的增强,或两者兼而有之。如果我正确地遵循了你的代码,那么你就有了标量标签的温度。在不知道图像性质的情况下,我猜旋转和翻转不太可能与温度有关,因此标签被保留,并且您都可以按原样使用 ImageDataGenerator。如果不尝试,很难知道这些增强是否有助于培训。相反,ImageDataGenerator 确实具有亮度增强,这是我可以想象的图像中温度依赖的那种东西。在这种情况下,标签不会保留,您必须手动增加它们,因为我认为 ImageDataGenerator 没有标量标签的方法。根据我的经验,后一种增强(标签未保留)更明显有用。但是要获得匹配的标签增强,您可能需要比 ImageDataGenerator 提供更多的手动编码;幸运的是,它可能不会太难。

匹配标签增强的一些基本元素可能是这样的(这不是完整的代码,只是片段):

  1. 为 ImageDataGenerator 扩充设置参数子集,这些参数对您在便利字典中的标量标签有意义:
regression_aug = dict(fill_mode='nearest',
                        rotation_range=3,
                        width_shift_range=0.1,
                        height_shift_range=0.1,
  1. 使用 ImageDataGenerator 方法 get_random_transform:
self.tparams[i] = self.generator.get_random_transform(self.img_dims)
  1. 将其应用于训练图像,并进一步手动将其应用于标量标签:
batch_X[i] = self.generator.apply_transform(img[i], self.tparams[i]))
batch_y[i,0] = self.lbl[x,0] - self.tparams[i]['tx']
batch_y[i,1] = self.lbl[x,1] - self.tparams[i]['ty']
batch_y[i,2] = self.lbl[x,2] - self.tparams[i]['theta']

在这个例子中,我有由位置和方向组成的标量标签,这样它们就可以在增强过程中被合理地平移和旋转。


推荐阅读