精华内容
参与话题
问答
  • 各种对抗神经网络GAN)大合集
  • 本文的背景论文是:GAN Dissection: Visualizing and Understanding Generative Adversarial Networks 本文提供了对GAN内部表示的深入了解,并对以下问题给出了密切的答案。 GAN学到了什么...

    https://www.toutiao.com/a6639218779840578061/

    2018-12-26 16:39:49

    本文的背景论文是:GAN Dissection: Visualizing and Understanding Generative Adversarial Networks

    本文提供了对GAN内部表示的深入了解,并对以下问题给出了密切的答案。

    GAN学到了什么?我们都看到了GAN产生的令人惊叹的结果,在某些情况下几乎与人类工作无法区分。但他们如何代表学到的知识仍然是一个谜。他们只是学习像素模式并合成他们看到的内容吗?或者他们真的从训练数据中捕获了某种复杂的关系?

    本文试图破译GAN的表示,并说明可视化和调试它们的技术。它分为两个阶段。

    对抗神经网络GAN到底学到了什么

     

    解剖

    解剖旨在识别生成器中图层输出所代表的对象类。例如,G中的特定单位是否代表树木?

    一些术语:

    unit:生成器G的特征图的每个通道

    r:生成器层的一个输出

    过滤器的特征映射给出了对象类的分割的良好近似(Bau et al.)。对于我们感兴趣的每个对象类,我们首先计算生成的图像中类的分割掩码。我们使用下面的公式对单位u的特征映射进行上采样和阈值处理。然后,我们在这个阈值化的上采样特征映射和类的分段掩码之间进行IOU。

    对抗神经网络GAN到底学到了什么

     

    表示交集,表示并集。s_c(x)表示图像x中特定类c的分割掩码以上还提到了用于计算特定单元和类的阈值的公式。简而言之,上面的公式给出了一个单位u代表c类的量度。您可以在本文中详细了解阈值公式背后的直觉。

    对抗神经网络GAN到底学到了什么

     

    对抗神经网络GAN到底学到了什么

     

    因此,通过对每个类c获得的值排序这些分数,对单元表示的排名概念(对象类)进行排序。

    TLDR; 解析允许您发现与对象类紧密匹配的单元。但这并不一定意味着他们有责任产生它们。

    干预

    干预旨在找出一组单元是否导致对象类c。这是通过打开和关闭单元并观察对生成的图像G的影响来完成的。

    对抗神经网络GAN到底学到了什么

     

    r:来自G的特定层的张量输出(激活图)

    U:单元组

    P:生成的图像G中的像素

    消融是指通过将U设置为0来关闭U中的单位。另一方面,插入强制U中的单位等于k,每个类常数。通过获取导致c的单位的特征映射的平均值来计算类c的k。

    对抗神经网络GAN到底学到了什么

     

    上面的公式给出了单元U负责生成c类的量度。该度量被称为平均因果效应(ACE)。这里,s_c(x)表示像素P处的图像x中的类c的分割图。因此,基本上插入和消融时G中的类c的分割图的因果效应之间的差异。

    但是我们怎么知道如何选择最佳的单元U?通过详尽的搜索来选择最佳组合是很棘手的。这是通过使用聪明的目标函数并将这项工作外包到梯度下降来完成的。

    我们将U设置为整个单元集,但使用参数向量alpha对它们进行权衡。然后使用随机梯度下降来最大化目标函数(ACE)并最小化最优集合中的单元数量(通过对α使用L2正则化项)。

    对抗神经网络GAN到底学到了什么

     

    对抗神经网络GAN到底学到了什么

    添加L2正则化项以最小化最优集合中的单元数量

    下图显示了导致树成功的消融单元如何从生成的图像中成功删除树。

    对抗神经网络GAN到底学到了什么

    消融单元以移除树木

    结果简而言之

    图层之间的差异:根据结果​​,第一层与井对象类不匹配。这具有直观意义,因为早期层通常代表原始特征。中间层有许多与语义对象和对象部分匹配的单元。结束图层匹配局部像素图案,例如材质,边缘和颜色。

    对抗神经网络GAN到底学到了什么

     

    GAN架构之间的差异:本文还讨论了不同架构如何通过检查单元来比较内部表示。

    通过插入的上下文关系:本文还描述了通过强制单元将特征插入到生成的图像的特定位置。一个有趣的观察是,像门这样的物体只能插入视觉上有意义的特定位置(例如,靠近窗户,砖块的建筑物)。这表明GANS实际上捕获了对象之间的关系,而不仅仅是像素模式。

    对抗神经网络GAN到底学到了什么

     

    上图说明了对象类的生成如何高度依赖于本地上下文。插入的实际效果因其发生的位置而异。

    诊断GAN

    通过使用干预技术,我们可以研究生成的图像中错误/不良部分和伪影的原因。通过手动注释和消除引起的单位,可以显着提高GAN的结果。下图说明了消融伪影导致单元如何产生可见结果。

    对抗神经网络GAN到底学到了什么

     

    使用此框架,您可以手动定制和影响GAN的结果。增强或减少某些对象类的存在(在一定程度上)相对简单。

    最后的想法

    这篇论文做了一个很好的尝试,揭开了GAN的神秘面纱,这是一个相对未开发的话题。他们的框架使研究人员和从业人员能够更好地调试,改进和理解他们的模型。

    讨论的调试方法主要基于人工监督。但是,我相信本文中提出的推理和技术可能会用于开发更多自动化技术来改进GAN。

    展开全文
  • 生成式对抗网络GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。 模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(...

    GAN简介

    生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。

    模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。

    通俗的讲,初始的生成网络(generated)与判别网络(discriminator)什么都不懂, 把初始的生成网络比喻成画家,那么初始的判别网络就是鉴画师,什么都不懂的画师画了幅画,于是给鉴画师辨认是否画的好,鉴画师也什么都不懂,只能对比世界名画判断好坏, 将意见反馈给画师,不停重复操作,画师不断进步的同时,鉴画师也会进步,画师最终会努力接近世界名画的水平,这就是GAN。

    GAN应用

    目前GAN最常使用的地方就是图像生成,如超分辨率任务语义分割数据增加等等

    GAN的基本结构

    GAN是将一组向量矩阵输入生成网络中训练出一组虚假数据,再与真数据进行合并进入判别网络训练,虚假数据的判别网络训练标签为0,真数据的判别网络训练标签为1,不断循环训练,使生成图像逼近原始图像。
    在这里插入图片描述

    GAN的基本原理

    首先从现有的数据中挑选出一批数据,组成Pdata(x)Pdata(x),然后训练一个PG(x;θ)PG(x;θ)来产生数据(例如一个高斯混合模型),我们希望产生的数据集PG(x;θ)PG(x;θ)与原来的数据Pdata(x)Pdata(x)越接近越好,即使得下面的似然函数达到最大值:
    在这里插入图片描述

    因此需要求得的参数为:
    θ∗=argmaxθ∏i=1mPG(xi;θ)
    取对数,得:
    在这里插入图片描述

    GAN实践

    激活函数

    tanh
    在这里插入图片描述
    ReLu
    在这里插入图片描述
    sigmoid
    在这里插入图片描述
    Leaky ReLUs
    ReLU是将所有的负值都设为零,相反,Leaky ReLU是给所有负值赋予一个非零斜率。Leaky ReLU激活函数是在声学模型(2013)中首次提出的。以数学的方式我们可以表示为:

    在这里插入图片描述
    在这里插入图片描述是(1,+∞)区间内的固定参数。
    下图是ReLU、Leaky ReLU、PReLU和RReLU的比较:
    在这里插入图片描述

    GAN在MNIST数据集上的体现

    
    
    import os
    
    os.environ["KERAS_BACKEND"] = "tensorflow"
    import numpy as np
    from tqdm import tqdm
    import matplotlib.pyplot as plt
    
    from keras.layers import Input
    from keras.models import Model, Sequential
    from keras.layers.core import Reshape, Dense, Dropout, Flatten
    from keras.layers.advanced_activations import LeakyReLU
    from keras.layers.convolutional import Convolution2D, UpSampling2D
    from keras.layers.normalization import BatchNormalization
    from keras.datasets import mnist
    from keras.optimizers import Adam
    from keras import backend as K
    from keras import initializers
    
    K.set_image_dim_ordering('th')
    
    np.random.seed(1000)
    
    # 为了与其他GAN实现保持一致,维度保留为100。
    randomDim = 100
    
    # MNIST数据加载
    (X_train, y_train), (X_test, y_test) = mnist.load_data()
    X_train = (X_train.astype(np.float32) - 127.5) / 127.5
    X_train = X_train.reshape(60000, 784)
    
    # Optimizer
    adam = Adam(lr=0.0002, beta_1=0.5)
    
    generator = Sequential()
    generator.add(Dense(256, input_dim=randomDim, kernel_initializer=initializers.RandomNormal(stddev=0.02)))
    generator.add(LeakyReLU(0.2))
    generator.add(Dense(512))
    generator.add(LeakyReLU(0.2))
    generator.add(Dense(1024))
    generator.add(LeakyReLU(0.2))
    generator.add(Dense(784, activation='tanh'))
    generator.compile(loss='binary_crossentropy', optimizer=adam)
    
    discriminator = Sequential()
    discriminator.add(Dense(1024, input_dim=784, kernel_initializer=initializers.RandomNormal(stddev=0.02)))
    discriminator.add(LeakyReLU(0.2))
    discriminator.add(Dropout(0.3))
    discriminator.add(Dense(512))
    discriminator.add(LeakyReLU(0.2))
    discriminator.add(Dropout(0.3))
    discriminator.add(Dense(256))
    discriminator.add(LeakyReLU(0.2))
    discriminator.add(Dropout(0.3))
    discriminator.add(Dense(1, activation='sigmoid'))
    discriminator.compile(loss='binary_crossentropy', optimizer=adam)
    
    # 联合网络
    discriminator.trainable = False
    ganInput = Input(shape=(randomDim,))
    x = generator(ganInput)
    ganOutput = discriminator(x)
    gan = Model(inputs=ganInput, outputs=ganOutput)
    gan.compile(loss='binary_crossentropy', optimizer=adam)
    
    dLosses = []
    gLosses = []
    
    
    # 绘制每个批次的损失
    def plotLoss(epoch):
        plt.figure(figsize=(10, 8))
        plt.plot(dLosses, label='Discriminitive loss')
        plt.plot(gLosses, label='Generative loss')
        plt.xlabel('Epoch')
        plt.ylabel('Loss')
        plt.legend()
        plt.savefig('images/gan_loss_epoch_%d.png' % epoch)
    
    
    #创建一个生成MNIST图像
    def plotGeneratedImages(epoch, examples=100, dim=(10, 10), figsize=(10, 10)):
        noise = np.random.normal(0, 1, size=[examples, randomDim])
        generatedImages = generator.predict(noise)
        generatedImages = generatedImages.reshape(examples, 28, 28)
    
        plt.figure(figsize=figsize)
        for i in range(generatedImages.shape[0]):
            plt.subplot(dim[0], dim[1], i + 1)
            plt.imshow(generatedImages[i], interpolation='nearest', cmap='gray_r')
            plt.axis('off')
        plt.tight_layout()
        plt.savefig('images/gan_generated_image_epoch_%d.png' % epoch)
    
    
    # 保存生成器和鉴别器网络(和权重),以供以后使用
    def saveModels(epoch):
        generator.save('models/gan_generator_epoch_%d.h5' % epoch)
        discriminator.save('models/gan_discriminator_epoch_%d.h5' % epoch)
    
    
    def train(epochs=1, batchSize=128):
        batchCount = X_train.shape[0] / batchSize
        print('Epochs:', epochs)
        print('Batch size:', batchSize)
        print('Batches per epoch:', batchCount)
    
        for e in range(1, epochs + 1):
            print('-' * 15, 'Epoch %d' % e, '-' * 15)
            # tqdm在运行行记录输出每轮训练进度
            for _ in tqdm(range(int(batchCount))):
                # 获得一组随机的输入噪声和图像
                noise = np.random.normal(0, 1, size=[batchSize, randomDim])
                imageBatch = X_train[np.random.randint(0, X_train.shape[0], size=batchSize)]
                
                # 生成虚假MNIST图像
                generatedImages = generator.predict(noise)
                X = np.concatenate([imageBatch, generatedImages])
    
                # 生成和实际数据的标签
                yDis = np.zeros(2 * batchSize)
                # One-sided label smoothing
                yDis[:batchSize] = 0.9
    
                # 训练判别器
                discriminator.trainable = True
                dloss = discriminator.train_on_batch(X, yDis)
    
                # 训练生成器
                noise = np.random.normal(0, 1, size=[batchSize, randomDim])
                yGen = np.ones(batchSize)
                discriminator.trainable = False
                gloss = gan.train_on_batch(noise, yGen)
    
            dLosses.append(dloss)
            gLosses.append(gloss)
    
            if e == 1 or e % 20 == 0:
                plotGeneratedImages(e)
                saveModels(e)
    
        # 描绘每个时代的损失
        plotLoss(e)
    
    
    if __name__ == '__main__':
        train(200, 128)
    
    

    训练结果

    迭代1轮对抗生成的图片
    在这里插入图片描述
    迭代100轮对抗生成的图片
    在这里插入图片描述
    迭代200轮对抗生成的图片
    在这里插入图片描述
    模型实际在迭代80轮左右就相对成型了

    模型训练损失折线图

    在这里插入图片描述
    代码地址

    展开全文
  • GAN,generative adversarial network,生成式对抗神经网络, 是生成模型的一种。 生成模型主要分两种,一种由输入数据,得到概率密度分布,另外一种,由输入数据,得到与输入数据相同发布的 ...

    当你看到以假乱真的图片或视频,看到风格迁移的图片或视频,你应当知道,其背后的机器学习技术是GAN!

    GAN, generative adversarial network, 生成式对抗神经网络, 是生成模型的一种。

    生成模型主要分两种,一种由输入数据,得到概率密度分布,另外一种,由输入数据,得到与输入数据相同分布的输出数据,GAN属于第二种。更多的关于生成模型的分类,见下图。

    GAN是怎样工作的呢?

    GAN有两个网络,一个是生成器,希望生成同训练数据相同分布的样本,一个是判别器,希望将生成数据(fake)和训练数据(real)区分开来。

    判别器希望real的output接近1,fake的output接近0,下面是判别器的损失函数的定义(只有一种):

    def discriminator_loss(real_output, fake_output):
        real_loss = cross_entropy(tf.ones_like(real_output), real_output)
        fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output)
        total_loss = real_loss + fake_loss
        return total_loss

    生成器的损失函数有三种(零和游戏,非饱和游戏和最大似然游戏), 在非饱和游戏中,生成器希望fake经过判别器判别的output接近1,非饱和游戏中生成器的损失函数的定义如下:

    def generator_loss(fake_output):
        return cross_entropy(tf.ones_like(fake_output), fake_output)

    下图中的D表示判别器(函数),G表示生成器(函数):

    需要注意,生成器的损失函数既依赖于生成器神经网络的参数,也依赖于判别器神经网络的参数;同样判别器的损失函数既依赖于判别器神经网络的参数,也依赖于生成器神经网络的参数。

    训练GAN是一个博弈的过程,需要找到纳什均衡。

     

    以上图片来自于 NIPS 2016 Tutorial: Generative Adversarial Networks by Ian Goodfellow

    用来表示损失函数的定义的示例代码来自于 tensorflow tutorials https://www.tensorflow.org/tutorials/generative/dcgan

     

    祖国翔,于上海

    https://www.linkedin.com/in/guoxiang-zu/

    展开全文
  • 在训练生成网络的时候,我们需要联合判别网络一起才能达到训练的目的,对于生成网络的训练其实是对生成-判别网络串接的训练。 a.生成了假样本,把这些假样本的标签都设置为1,也就是认为这些假样本在生成网络训练的...

    一、

    1、生成模型(G)+判别模型(D)

    2、输入的只有真实样本集(无标签)

    3、单独交替迭代训练。在训练生成网络的时候,我们需要联合判别网络一起才能达到训练的目的,对于生成网络的训练其实是对生成-判别网络串接的训练。

        a.生成了假样本,把这些假样本的标签都设置为1,也就是认为这些假样本在生成网络训练的时候是真样本(迷惑判别器的目的,也才能使得生成的假样本逐渐逼近为正样本);

        b.在对于生成网络的训练,我们有了样本集(只有假样本集,没有真样本集),有了对应的label(全为1)。(在训练这个串接的网络的时候,一个很重要的操作就是不要判别网络的参数发生变化,也就是不让它参数发生更新,只是把误差一直传,传到生成网络那块后更新生成网络的参数。这样就完成了生成网络的训练了

    4、在完成生成网络训练后,又有了新的真假样本集(其实是新的假样本集),重复上述过程了。把这个过程称作为单独交替训练;

    5、定义一个迭代次数,交替迭代到一定次数后停止即可。

    二、


    公式代表的是最大最小优化,先拆解优化判别网络D,再优化G。

    优化D:


    判别网络的优化和生成网络无关。G(z)这里就相当于已经得到的假样本,x相当于真样本。优化D的公式的第一项,使的真样本x输入的时候,得到的结果越大越好;对于假样本,需要优化是的其结果越小越好,也就是D(G(z))越小越好。第二项改成1-D(G(z)),两者合起来就是越大越好。

    优化G:


    同样在优化G的时候,和真样本无关,所以第一项直接却掉了,只有假样本这个时候是希望假样本的标签是1的,所以是D(G(z))越大越好,但是呢为了统一成1-D(G(z))的形式,那么只能是最小化1-D(G(z))。

    展开全文
  • GAN于2014年提出并在最近几年变得越来越活跃,主要用于数据扩充,以解决如何通过隐含生成模型来生成人造自然外观样本以模拟真实世界数据的问题,从而可以增加未公开的训练数据样本数量[122]。 K. G. Hartmann, R. T...
  • Gan对抗神经网络 概念: 1.判别器:判别生成物体的可识别度 2.生成器:生成物体 思路:将判别与生成放在一个网络体系中,判别网络与生成网络一起训练。 (固定生成器)判别器训练思路:真样本,真标签(1),...
  • 最近一直在琢磨Generative Adversarial Imitation Learning这篇文章的内容和实现,也自己实现了几个GAN,但是效果都不是很理想,因此找到了一篇专门讲...相较于其他的神经网络GAN在下面几个方面遇到的问题更为严重...
  • GAN4.AEGAN:基于自编码的GAN5.WGAN:基于推土机距离的GAN6.WGAN-GP:带梯度惩罚项的WGAN7.LSGAN:最小乘二GAN8.GAN-cls:具有匹配感知的判别器9.SRGAN:适用超分辨率重建的GAN9.1 ESPCN:基于卷积神经网络的图像超...
  • GAN又名生成对抗网络,其主要作用是图像生成,我们在用图像训练模型的时候需要大量的数据集。但是如果我们的数据集不够怎么办呢?我们可以利用数据增强的方法,对图像进行上下左右的翻转,做随即剪切,也可以自己...
  • 如果先计算d_loss,在d_loss.backward()后会默认自动释放掉【real_img -> G -> fake_img -> D】这个计算图,但是在执行g_loss.backward()时需要【real_img -> G -> fake_img】这一段的计算图,所以会...
  • 生成式对抗神经网络GAN原理、Tensorflow搭建网络生成卡通人脸 下面这张图是我教计算机学画画,计算机学会之后画出来的,具体实现在下面。 ▲以下是对GAN形象化地表述 ●赵某不务正业、游手好闲,却整天做着发财梦。...
  • 对抗神经网络原理GAN

    2019-10-12 10:31:04
    看着篇博客个即可 https://blog.csdn.net/just_sort/article/details/79454054
  • 对抗神经网络GAN

    千次阅读 2019-05-23 09:48:58
    对抗神经网络其实是两个网络的组合,可以理解为一个网络生成模拟数据,另一个网络判断生成的数据是真实的还是模拟的。生成模拟数据的网络要不断优化自己让判别的网络判断不出来,判别的网络也要优化自己让自己判断得...
  • 最近在研究深度学习相关的知识,看了CNN、RNN、DNN等经典的神经网络,然后研究了一下生成模型,也就是今天要讲的生成对抗网络(GAN),打算出一个系列,毕竟关于生成对抗网络的论文太多了,github上有整理,有兴趣...
  • 对抗神经网络gan) ,

    2019-05-16 16:49:12
  • 论文题目:Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks ... 本文提出了一种在没有成对图像的情况下,学习将图像从...它使用两个镜像对称的GAN,构成了一个环形网络,两个GAN...
  • 各种对抗神经网络GAN)大合集

    千次阅读 2017-05-14 10:19:02
    I organized this reposity mainly for learning GANs, so all codes about classical GANs were implemented with simple network structure and tested by MNIST dataset. Just know about how mathmatical ana
  • 一、白话理解 GAN 假设一个城市治安混乱,很快,这个城市里就会出现无数的小偷。在这些小偷中,有的可能是盗窃高手,有的可能毫无技术可言。假如这个城市开始整饬其治安,突然开展一场打击犯罪的「运动」,警察们...
  • 对抗神经网络学习和实现(GAN)

    万次阅读 2018-03-06 09:46:55
    一,GAN的原理介绍 \quadGAN的基本原理其实非常简单,这里以生成图片为例进行说明。假设我们有两个网络,G(Generator)和D(Discriminator)。正如它的名字所暗示的那样,它们的功能分别是: ∙∙\bulletG是一...
  • 本资源是机器学习 台大教授 李宏毅对抗神经网络GAN是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。宏毅的授课配PPT讲稿。
  • 1.简介 先上一张,我最喜欢的流程图 G是一个生成式的网络,它接收一个随机的噪声z(随机数),通过这个噪声生成图像 D是一个判别网络,判别...2.接下来我们将以小例子的形式,了解GAN 2.1 定义我们的超参数 import ...
  • 解决办法:对抗神经网路 生成器和判别器,生成器用来生成图像(可以从文字生成图片,也可以图片生成图片),判别器用来判别该图像是否符合该描述 对于这样的哲学,不能出现对方比另外一方层次高太多,会导致...
  • 对抗神经网络(一)——GAN

    千次阅读 2019-02-25 15:39:46
    对抗神经网络其实是两个网络的组合,可以理解为一个网络生成模拟数据,另一个网络判断生成的数据是真实的还是模拟的。生成模拟数据的网络要不断优化自己让判别的网络判断不出来,判别的网络也要不断优化自己让判断的...
  • 神经网络GAN生成对抗网络

    千次阅读 2018-03-02 14:12:19
    \qquadGAN生成式对抗神经网络,是一种非监督学习算法,通过使用两个神经网络进行博弈进而实现学习。生成对抗网络是由一个生成网络和一个判别网络构成的。生成网络从latent space中进行随机采样作为网络的输入,使得...
  • 前言 经过大半年断断续续的学习和实践,终于将深度学习的基础知识看完了,虽然还有很多比较深入的内容没有涉及到,但也是感觉收获满满。因为是断断续续的学习做笔记写代码跑实验,所以笔记也零零散散的散落在每个...

空空如也

1 2 3 4 5 ... 20
收藏数 11,995
精华内容 4,798
关键字:

对抗神经网络