标签: generative-adversarial-network

DCGAN 调试。得到只是垃圾

介绍:

我正在尝试让 CDCGAN(条件深度卷积生成对抗网络)处理 MNIST 数据集,考虑到我使用的库(PyTorch)在其网站上有教程,这应该相当容易。
但我似乎无法让它工作,它只会产生垃圾或模型崩溃或两者兼而有之。

我试过的:

  • 使模型有条件的半监督学习
  • 使用批处理规范
  • 除了生成器和鉴别器上的输入/输出层之外,在每一层上使用 dropout
  • 标签平滑以打击过度自信
  • 向图像添加噪声(我猜你称之为实例噪声)以获得更好的数据分布
  • 使用leaky relu来避免梯度消失
  • 使用重放缓冲区来防止忘记学到的东西和过度拟合
  • 玩超参数
  • 将其与 PyTorch 教程中的模型进行比较
  • 除了嵌入层等一些事情之外,基本上我做了什么。

我的模型生成的图像:

超参数:

batch_size=50, learning_rate_discrimiantor=0.0001, learning_rate_generator=0.0003, shuffle=True, ndf=64, ngf=64, dropout=0.5
在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

batch_size=50, learning_rate_discriminator=0.0003, learning_rate_generator=0.0003, shuffle=True, ndf=64, ngf=64, dropout=0
在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

图片Pytorch 教程 模型生成:

pytorch 教程 dcgan 模型的代码
作为比较,这里是来自 pytorch turoial 的 DCGAN 的图像:
在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

我的代码:

import torch
import torch.nn as nn
import torchvision
from torchvision import transforms, datasets
import torch.nn.functional as F
from torch import optim as optim
from torch.utils.tensorboard import SummaryWriter …
Run Code Online (Sandbox Code Playgroud)

python neural-network pytorch generative-adversarial-network

30
推荐指数
1
解决办法
664
查看次数

如何解释生成对抗网中鉴别器的损失和发电机的损失?

我正在阅读人们对DCGAN的实现,特别是这个在tensorflow中的实现.

在该实现中,作者绘制了鉴别器和生成器的损失,如下所示(图像来自https://github.com/carpedm20/DCGAN-tensorflow):

在此输入图像描述

在此输入图像描述

鉴别器和发生器的损失似乎都没有遵循任何模式.与一般神经网络不同,其损失随着训练迭代的增加而减少.如何解释训练GAN时的损失?

neural-network deep-learning generative-adversarial-network gan

17
推荐指数
1
解决办法
1万
查看次数

用于 OCR 的场景文本图像超分辨率

我正在研究 OCR 系统。我在识别ROI内的文本时面临的一个挑战是抖动运动效果镜头或由于角度位置无法聚焦的文本。请考虑以下演示示例

在此处输入图片说明

如果您注意到文本(例如标记为红色),在这种情况下 OCR 系统无法正确识别文本。但是,这种情况也可能在没有角度拍摄的情况下出现,其中图像太模糊以至于 OCR 系统无法识别或部分识别文本。有时它们很模糊,有时分辨率很低像素化。例如

在此处输入图片说明

我们尝试过的方法

首先,我们尝试了 SO 上可用的各种方法。但遗憾的是没有运气。

接下来,我们尝试了以下三种最有前途的方法。

1.TSRN

最近的一项研究工作(TSRN)主要关注此类案例。它的主要直觉是引入超分辨率(SR)技术作为预处理。到目前为止,这种实现看起来是最有前途的。但是,它无法在我们的自定义数据集上发挥作用(例如上面的第二张图片,蓝色文本)。以下是他们演示中的一些示例:

在此处输入图片说明

2. 神经增强

在查看其页面上的插图后,我们相信它可能会起作用。但遗憾的是它也无法解决这个问题。然而,即使是他们展示的例子,我也有点困惑,因为我也无法复制它们。我在 github上提出了一个问题,在那里我更详细地演示了这一点。以下是他们演示中的一些示例:

在此处输入图片说明

3. 情监侦

实现中希望最小的最后选择。也没有运气。

更新 1

  • [方法]:除此之外,我们还尝试了一些传统的方法,例如Out-of-focus Deblur Filter(Wiener 滤波器和无监督的Weiner 滤波器)。我们还检查了Richardson-Lucy方法。但这种方法也没有改进。

  • [方法]:我们已经检查了基于 GAN 的 DeBlur 解决方案。DeblurGAN我试过这个网络。吸引我的是Blind Motion Deblurring机制的方法。

最后,从这次 …

python ocr opencv text-recognition generative-adversarial-network

15
推荐指数
1
解决办法
1302
查看次数

将类信息添加到keras网络

我试图找出如何使用Generative Adversarial Networks的数据集标签信息.我试图使用可在此处找到的条件GAN的以下实现.我的数据集包含两个不同的图像域(真实对象和草图),具有公共类信息(椅子,树,橙等).我选择了这种实现,它只将两个不同的域视为对应的不同"类"(列车样本X对应于真实图像,而目标样本y对应于草图图像).

有没有办法修改我的代码并考虑我整个架构中的类信息(椅子,树等)?我希望我的鉴别器能够预测我生成的图像来自生成器是否属于特定类,而不仅仅是它们是否真实.实际上,在当前架构中,系统学会在所有情况下创建类似的草图.

更新:鉴别器返回一个大小的张量1x7x7然后两者y_truey_pred在计算损失之前通过展平层:

def discriminator_loss(y_true, y_pred):
     BATCH_SIZE=100
     return K.mean(K.binary_crossentropy(K.flatten(y_pred), K.concatenate([K.ones_like(K.flatten(y_pred[:BATCH_SIZE,:,:,:])),K.zeros_like(K.flatten(y_pred[:BATCH_SIZE,:,:,:])) ]) ), axis=-1)
Run Code Online (Sandbox Code Playgroud)

以及鉴别器对发电机的损失功能:

def discriminator_on_generator_loss(y_true,y_pred):
     BATCH_SIZE=100
     return K.mean(K.binary_crossentropy(K.flatten(y_pred), K.ones_like(K.flatten(y_pred))), axis=-1)
Run Code Online (Sandbox Code Playgroud)

此外,我对输出1层的鉴别器模型的修改:

model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
#model.add(Activation('sigmoid'))
Run Code Online (Sandbox Code Playgroud)

现在鉴别器输出1层.如何相应修改上述损失函数?我应该有7而不是1,n_classes = 6用于预测真实和假对的+一类吗?

python conv-neural-network keras loss-function generative-adversarial-network

13
推荐指数
1
解决办法
559
查看次数

GAN 中模式丢弃和模式崩溃之间的区别?

最近我读到一篇论文,他们提到了训练 GAN 时的这两个问题。我知道模式崩溃,即生成器产生有限种类的样本,但是我没有找到关于模式下降的很好的解释。

有人有好的答案吗?

论文内容如下:生成对抗网络评估指标的实证研究

artificial-intelligence neural-network generative-adversarial-network

9
推荐指数
1
解决办法
1558
查看次数

更改CNN以使用3D卷积

我正在使用从此处本文为纸)创建GAN的代码。我正在尝试将其应用于新领域,从其在MNIST上的应用切换到3D脑MRI图像。我的问题是GAN本身的定义。

例如,他们用于定义生成模型的代码(采用z_dim尺寸的噪声并从MNIST分布生成图像,因此为28x28)就是这样,我的评论基于我的看法:

def generate(self, z):
    # start with noise in compact space
    assert z.shape[1] == self.z_dim

    # Fully connected layer that for some reason expands to latent * 64
    output = tflib.ops.linear.Linear('Generator.Input', self.z_dim,
                                     self.latent_dim * 64, z)
    output = tf.nn.relu(output)
    # Reshape the latent dimension into 4x4 MNIST
    output = tf.reshape(output, [-1, self.latent_dim * 4, 4, 4])

    # Reduce the latent dimension to get 8x8 MNIST
    output = tflib.ops.deconv2d.Deconv2D('Generator.2', self.latent_dim * 4,
                                         self.latent_dim * 2, 5, …
Run Code Online (Sandbox Code Playgroud)

python conv-neural-network tensorflow niftynet generative-adversarial-network

9
推荐指数
1
解决办法
273
查看次数

保存并加载 GAN 模型,以便使用 Keras 继续训练

我正在尝试保存 GAN 模型,以便稍后继续训练。

基本上,我在训练循环后分别保存鉴别器和生成器,使用以下命令:

discriminator.save("discriminatorTrained.h5")
generator.save("generatorTrained.h5")
Run Code Online (Sandbox Code Playgroud)

然后,当我想继续训练时,我会像这样加载它们:

# Load Discriminator and Generator
discriminator = load_model('discriminatorTrained.h5')
generator = load_model('generatorTrained.h5')
discriminator.trainable = False
Run Code Online (Sandbox Code Playgroud)

然后我用加载的鉴别器和生成器制作一个新的 GAN,如下所示:

#Make new GAN from trained discriminator and generator
gan_input = Input(shape=(noise_dim,))
fake_image = generator(gan_input)
gan_output = discriminator(fake_image)
gan = Model(gan_input, gan_output)
gan.compile(loss='binary_crossentropy', optimizer=optimizer)
Run Code Online (Sandbox Code Playgroud)

然后运行与我从一开始就执行的相同的训练脚本。

我没有收到任何错误消息,而且它似乎可以工作,但是,如果比较结果(例如保存和加载并继续训练 10 次),生成器产生的结果似乎不如我只运行一个训练 10 个 epoch。

所以我怀疑,我可能在这里遗漏了一些东西,在这个过程中是否丢失了一些训练信息,也许是在 GAN 模型的重建过程中?

neural-network keras tensorflow generative-adversarial-network

8
推荐指数
0
解决办法
3950
查看次数

在经过一定数量的 epoch 之后,GAN 中的假图像创建变得最糟糕

我正在尝试创建 GAN 模型。这是我的 discriminator.py

import torch.nn as nn
class D(nn.Module):
    feature_maps = 64
    kernel_size = 4
    stride = 2
    padding = 1
    bias = False
    inplace = True

    def __init__(self):
        super(D, self).__init__()
        self.main = nn.Sequential(
            nn.Conv2d(4, self.feature_maps, self.kernel_size, self.stride, self.padding, bias=self.bias),
            nn.LeakyReLU(0.2, inplace=self.inplace),
            nn.Conv2d(self.feature_maps, self.feature_maps * 2, self.kernel_size, self.stride, self.padding,
                      bias=self.bias),
            nn.BatchNorm2d(self.feature_maps * 2), nn.LeakyReLU(0.2, inplace=self.inplace),
            nn.Conv2d(self.feature_maps * 2, self.feature_maps * (2 * 2), self.kernel_size, self.stride, self.padding,
                      bias=self.bias),
            nn.BatchNorm2d(self.feature_maps * (2 * 2)), nn.LeakyReLU(0.2, inplace=self.inplace),
            nn.Conv2d(self.feature_maps * (2 * 2), …
Run Code Online (Sandbox Code Playgroud)

python artificial-intelligence conv-neural-network pytorch generative-adversarial-network

8
推荐指数
1
解决办法
266
查看次数

Style Transfer 和 GAN 之间的关系是什么?

我刚刚开始讨论这些主题。据我所知,风格迁移从一个图像中获取内容,从另一个图像中获取风格,以第二个的风格生成或重新创建第一个,而GAN基于训练集生成全新的图像。

但是我看到很多地方两者可以互换使用,比如这里的这篇博客和其他使用 GAN 实现风格迁移的地方,比如这里的这篇论文

GAN 和样式迁移是两种不同的东西,还是 GAN 是实现样式迁移的方法,还是它们都是做同一件事的不同东西?两者之间的界限究竟在哪里?

neural-network deep-learning conv-neural-network style-transfer generative-adversarial-network

7
推荐指数
1
解决办法
1531
查看次数

Wasserstein 损失可以是负数吗?

我目前正在用(大约)Wasserstein 损失在 keras 中训练 WGAN,如下所示:

def wasserstein_loss(y_true, y_pred):
    return K.mean(y_true * y_pred)
Run Code Online (Sandbox Code Playgroud)

但是,这种损失显然可能是负数,这对我来说很奇怪。

我对 WGAN 进行了 200 个 epoch 的训练,得到了下面的评论家 Wasserstein 损失训练曲线。 Wasserstein 损失训练曲线

上述损失计算为

d_loss_valid = critic.train_on_batch(real, np.ones((batch_size, 1)))
d_loss_fake = critic.train_on_batch(fake, -np.ones((batch_size, 1)))
d_loss, _ = 0.5*np.add(d_loss_valid, d_loss_fake)
Run Code Online (Sandbox Code Playgroud)

结果生成的样本质量很好,所以我认为我正确地训练了 WGAN。但是我仍然无法理解为什么 Wasserstein 损失可能为负并且模型仍然有效。根据原始WGAN论文,Wasserstein loss可以作为GAN的性能指标,那么我们应该如何解释呢?我有什么误解吗?

python machine-learning neural-network keras generative-adversarial-network

7
推荐指数
1
解决办法
4729
查看次数