AI 大模型之 计算机视觉 数据增强 对抗样本 / 自监督增广 实战

AI人工智能阿木 发布于 9 天前 5 次阅读


计算机视觉:数据增强实战——对抗样本与自监督增广技术

在计算机视觉领域,数据是训练模型的基础。现实世界中往往存在数据量不足、数据分布不均等问题,这限制了模型的性能。为了解决这些问题,数据增强技术应运而生。数据增强通过模拟真实世界中的数据变化,扩充数据集,从而提高模型的泛化能力。本文将围绕数据增强中的对抗样本和自监督增广技术进行实战探讨。

数据增强概述

数据增强是一种通过变换原始数据来生成新的数据样本的技术,旨在提高模型对数据的鲁棒性和泛化能力。常见的数据增强方法包括旋转、缩放、裁剪、翻转、颜色变换等。

对抗样本生成

对抗样本是指通过微小扰动原始样本,使得模型对扰动后的样本做出错误预测的样本。对抗样本的生成可以帮助模型学习到更加鲁棒的特征,提高模型对噪声和干扰的抵抗力。

1. 生成对抗网络(GAN)

生成对抗网络(GAN)是一种由生成器和判别器组成的对抗模型。生成器负责生成与真实样本相似的样本,而判别器负责判断样本的真实性。通过不断训练,生成器逐渐生成更加逼真的样本,而判别器逐渐提高对真实样本的识别能力。

以下是一个简单的GAN模型实现示例:

python

import tensorflow as tf


from tensorflow.keras.models import Model


from tensorflow.keras.layers import Input, Dense, Conv2D, Flatten, Reshape

生成器


def generator(z):


model = tf.keras.Sequential([


Dense(128, activation='relu', input_shape=(100,)),


Dense(256, activation='relu'),


Dense(512, activation='relu'),


Dense(1024, activation='relu'),


Dense(784, activation='sigmoid'),


Reshape((28, 28, 1))


])


return model(z)

判别器


def discriminator(x):


model = tf.keras.Sequential([


Conv2D(32, (3, 3), strides=(2, 2), padding='same', input_shape=(28, 28, 1)),


tf.keras.layers.LeakyReLU(alpha=0.2),


Conv2D(64, (3, 3), strides=(2, 2), padding='same'),


tf.keras.layers.LeakyReLU(alpha=0.2),


Flatten(),


Dense(1, activation='sigmoid')


])


return model(x)

模型构建


z = Input(shape=(100,))


x = generator(z)


d = discriminator(x)

损失函数


cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)


def generator_loss(generated_output):


return cross_entropy(tf.ones_like(generated_output), generated_output)

def discriminator_loss(real_output, generated_output):


real_loss = cross_entropy(tf.ones_like(real_output), real_output)


generated_loss = cross_entropy(tf.zeros_like(generated_output), generated_output)


return real_loss + generated_loss

模型编译


generator_optimizer = tf.keras.optimizers.Adam(1e-4)


discriminator_optimizer = tf.keras.optimizers.Adam(1e-4)

@tf.function


def train_step(images):


noise = tf.random.normal([batch_size, 100])


with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:


generated_images = generator(noise)


real_output = discriminator(images)


generated_output = discriminator(generated_images)

gen_loss = generator_loss(generated_output)


disc_loss = discriminator_loss(real_output, generated_output)

gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)


gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)

generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))


discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))

训练过程


for epoch in range(epochs):


for image_batch in train_dataset:


train_step(image_batch)


2. Fast Gradient Sign Method(FGSM)

FGSM是一种简单的对抗样本生成方法,通过计算梯度并乘以一个小的扰动值来生成对抗样本。

以下是一个使用FGSM生成对抗样本的示例:

python

import numpy as np


import tensorflow as tf

def fgsm_attack(model, x, epsilon=0.01):


x = tf.convert_to_tensor(x, dtype=tf.float32)


x = tf.expand_dims(x, 0)


with tf.GradientTape() as tape:


tape.watch(x)


logits = model(x)


loss = tf.keras.losses.categorical_crossentropy(tf.ones_like(logits), logits)


gradients = tape.gradient(loss, x)


signed_grad = tf.sign(gradients)


x_adv = x - epsilon signed_grad


return x_adv.numpy()


自监督增广

自监督增广是一种无需标签的数据增强方法,通过学习数据中的潜在结构来生成新的样本。自监督增广可以提高模型在无标签数据上的学习效果,减少对标注数据的依赖。

1. 自编码器

自编码器是一种无监督学习模型,通过学习输入数据的低维表示来重构输入数据。自编码器可以用于生成新的数据样本。

以下是一个简单的自编码器实现示例:

python

import tensorflow as tf


from tensorflow.keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D

def autoencoder(input_shape):


input_img = Input(shape=input_shape)


x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)


x = MaxPooling2D((2, 2), padding='same')(x)


x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)


x = MaxPooling2D((2, 2), padding='same')(x)


x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)


encoded = MaxPooling2D((2, 2), padding='same')(x)

x = Conv2D(32, (3, 3), activation='relu', padding='same')(encoded)


x = UpSampling2D((2, 2))(x)


x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)


x = UpSampling2D((2, 2))(x)


x = Conv2D(32, (3, 3), activation='relu')(x)


decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

autoencoder = Model(input_img, decoded)


autoencoder.compile(optimizer='adam', loss='binary_crossentropy')


return autoencoder


2. 伪标签

伪标签是一种基于自监督学习模型生成的新样本标签的方法。通过将自监督学习模型的输出作为伪标签,可以用于后续的监督学习任务。

以下是一个使用伪标签的示例:

python

import numpy as np


import tensorflow as tf

def generate_pseudo_labels(model, x, threshold=0.5):


predictions = model.predict(x)


pseudo_labels = np.where(predictions > threshold, 1, 0)


return pseudo_labels


总结

本文介绍了数据增强中的对抗样本和自监督增广技术。通过生成对抗样本,可以提高模型的鲁棒性;而自监督增广则可以帮助模型在无标签数据上学习。在实际应用中,可以根据具体任务需求选择合适的数据增强方法,以提高模型的性能。