对抗神经网络(二)——DCGAN

一、DCGAN介绍

DCGAN即使用卷积网络的对抗网络,其原理和GAN一样,只是把CNN卷积技术用于GAN模式的网络里,G(生成器)网在生成数据时,使用反卷积的重构技术来重构原始图片。D(判别器)网用卷积技术来识别图片特征,进而做出判别。同时,CDGAN中的卷积神经网络也做了一些结构的改变,以提高样本的质量和收敛速度。

DCGAN的generator网络结构图如下:

  • G网中使用ReLU作为激活函数,最后一层使用Tanh作为激活函数。
  • 去掉了FC层,使网络变为全卷积网络。

DCGAN的discriminator网络结构图如下:

  • D中取消所有的池化层,使用转置卷积(transposed convolutional layer)并且步长大于等于2进行上采样。
  • D网中也加入stride的卷积代替pooling。
  • 在D网和G网中均使用批量归一化(batch normalization),而在最后一层时通常不会使用batch normalization,这是为了保证模型能够学习到数据的正确均值和方差。
  • D网络中使用LeakyReLU作为激活函数。
  • DCGAN中换成了两个卷积神经网络(CNN)的G和D,可以刚好的学习对输入图像层次化的表示,尤其在生成器部分会有更好的模拟效果。DCGAN在训练过程中会使用Adam优化算法。

三、网络实现

以人脸数据为例

1、环境配置(Environments

  • window10
  • python3.6.4
  • TensorFlow1.13.1

2、数据准备

数据集:face-swap

数据可以从网上自行下载,或者利用自己的数据,这里对数据的没有严格要求。我是采用了网络上的数据集,这里给出数据的下载地址:https://anonfile.com/p7w3m0d5be/face-swap.zip将解压的数据分别放入文件夹A和文件夹B

3、超参数设置(Hyper-Parameters

  • Image Size = 64x64 
  • Batch Size = 64 
  • Learning Rate = 0.00005
  • Adam_beta1 = 0.5
  • z_dim = 100
  • Epoch = 500 
# 导入需要的包
from PIL import Image  # Image 用于读取影像
#from skimage import io  # io也可用于读取影响,效果比Image读取的更好一些

import tensorflow as tf  # 用于构建神经网络模型
import matplotlib.pyplot as plt  # 用于绘制生成影像的结果
import numpy as np  # 读取影像
import os  # 文件夹操作
import time  # 计时

# 设置相关参数
is_training = True
input_dir = "./face/"  # 原始数据的文件夹路径

# 设置超参数 hyper parameters
batch_size = 64
image_width = 64
image_height = 64
image_channel = 3
data_shape = [64, 64, 3]
data_length = 64 * 64 * 3

z_dim = 100
learning_rate = 0.00005
beta1 = 0.5
epoch = 500

4、读取数据并将原始数据数据resize成64*64*3的格式,原始图像大小为256*256*3

# 读取数据的函数
def prepare_data(input_dir, floder):
    '''
    函数功能:通过输入图像的路径,读取训练数据
    :参数 input_dir: 图像数据所在的根目录,即"./face"
    :参数 floder: 图像数据所在的子目录, 即"./face/A"
    :return: 返回读取好的训练数据
    '''

    # 遍历图像路径,并获取图像数量
    images = os.listdir(input_dir + floder)
    image_len = len(images)

  • 13
    点赞
  • 167
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
对抗神经网络(Adversarial Neural Network,简称ANN)是一种用于生成对抗样本的技术,其中包括生成对抗网络(GAN)和对抗性样本攻击。 对于分类数据,我们可以使用ANN来生成对抗性样本,使得分类器将其误分类。一种常见的方法是使用FGSM(Fast Gradient Sign Method),该方法通过在梯度上添加噪声来生成对抗性样本。具体步骤如下: 1. 输入一个原始样本x和对应的标签y。 2. 计算损失函数L(x,y)关于x的梯度。 3. 计算一个扰动项ε=ϵ∗sign(∇xL(x,y))。 4. 生成对抗性样本x'=x+ε。 5. 将x'输入到分类器中进行分类,观察分类结果是否与原始标签不同。 在代码实现上,可以使用Python和深度学习框架如TensorFlow或PyTorch来实现。以下是一个使用TensorFlow实现FGSM攻击的示例代码: ``` import tensorflow as tf # 定义分类器模型 def classifier_model(): # ... return logits # 定义FGSM攻击函数 def fgsm_attack(x, epsilon, classifier_fn): # 计算梯度 with tf.GradientTape() as tape: tape.watch(x) logits = classifier_fn(x) loss = tf.losses.softmax_cross_entropy(tf.one_hot(y_true, n_classes), logits) grad = tape.gradient(loss, x) # 生成对抗性样本 x_adv = x + epsilon * tf.sign(grad) x_adv = tf.clip_by_value(x_adv, 0, 1) # 将像素值限制在0到1之间 return x_adv # 加载数据集 (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() # 对数据进行预处理 x_train = x_train.reshape(-1, 28, 28, 1) / 255.0 x_test = x_test.reshape(-1, 28, 28, 1) / 255.0 # 定义模型和优化器 model = classifier_model() optimizer = tf.keras.optimizers.Adam(learning_rate=0.001) # 训练模型 for i in range(n_epochs): # ... with tf.GradientTape() as tape: # ... logits = model(x_batch) loss = tf.losses.softmax_cross_entropy(tf.one_hot(y_batch, n_classes), logits) grad = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(grad, model.trainable_variables)) # 生成对抗性样本并进行攻击 x_adv = fgsm_attack(x_batch, epsilon=0.1, classifier_fn=model) adv_logits = model(x_adv) adv_loss = tf.losses.softmax_cross_entropy(tf.one_hot(y_batch, n_classes), adv_logits) adv_acc = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(adv_logits, axis=-1), y_batch), tf.float32)) # ... ``` 注意:此代码仅为示例,具体实现可能因不同问题而有所不同。同时,攻击的效果也会受到多种因素的影响,如扰动大小、训练集分布等。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值