python - 如何将数据增强添加到回归问题?
问题描述
我正在尝试为具有 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')
解决方案
最初,您应该考虑保留标签的增强是否有用,或者需要匹配标签增强的增强,或两者兼而有之。如果我正确地遵循了你的代码,那么你就有了标量标签的温度。在不知道图像性质的情况下,我猜旋转和翻转不太可能与温度有关,因此标签被保留,并且您都可以按原样使用 ImageDataGenerator。如果不尝试,很难知道这些增强是否有助于培训。相反,ImageDataGenerator 确实具有亮度增强,这是我可以想象的图像中温度依赖的那种东西。在这种情况下,标签不会保留,您必须手动增加它们,因为我认为 ImageDataGenerator 没有标量标签的方法。根据我的经验,后一种增强(标签未保留)更明显有用。但是要获得匹配的标签增强,您可能需要比 ImageDataGenerator 提供更多的手动编码;幸运的是,它可能不会太难。
匹配标签增强的一些基本元素可能是这样的(这不是完整的代码,只是片段):
- 为 ImageDataGenerator 扩充设置参数子集,这些参数对您在便利字典中的标量标签有意义:
regression_aug = dict(fill_mode='nearest',
rotation_range=3,
width_shift_range=0.1,
height_shift_range=0.1,
- 使用 ImageDataGenerator 方法 get_random_transform:
self.tparams[i] = self.generator.get_random_transform(self.img_dims)
- 将其应用于训练图像,并进一步手动将其应用于标量标签:
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']
在这个例子中,我有由位置和方向组成的标量标签,这样它们就可以在增强过程中被合理地平移和旋转。
推荐阅读
- python - Pysimplegui,如何创建一个每 10 分钟从 json url 更新的活动窗口?
- javascript - Javascript:在 VueJS 中按位?
- .net-core - IdentityServer4 - 保护 WebAPI 操作
- python - 如果我有 Instagram 机器人登录语法错误,我该怎么办?
- sum - Protege OWL 计算一个类的孩子的一个属性的总和
- reactjs - 如何进行选择,其选项取决于其他选择
- python - 变量(参数)不会重新实例化
- javascript - 如何使用 *ngFor 循环 [object Object]
- mysql - MySQL 从每个值中选择 max()
- javascript - getSheets() Google Apps 脚本多次调用问题