当前位置:   article > 正文

深度卷积生成对抗网络DGCN_深度卷积对抗生成网络

深度卷积对抗生成网络

任务描述

本关任务:掌握DGCN生成对抗网络的基本思想和网络结构。

相关知识

为了完成本关任务,你需要掌握:1.深度卷积神经网络,2.深度卷积生成对抗网络。

深度卷积神经网络

CNN卷积神经网络可以说是传统神经网络的一个改进,它依然采用层次结构,只是层的功能和形式做了变化。与传统神经网络不同,CNN使用卷积构建网络层来进行信息提取。 一个典型的卷积神经网络层包括如下的结构: • 数据输入层/ Input layer • 卷积计算层/ CONV layer • ReLU激励层 / ReLU layer • 池化层 / Pooling layer • 全连接层 / FC layer 在这个层级中最重要且与之前网络不同的表示卷积层,这也是“卷积神经网络”的名字来源。 在卷积层中,有两个关键操作:局部关联。每个神经元看做一个滤波器(filter);窗口(receptive field)滑动,filter对局部数据计算。下面是它进行计算的过程示意图:

上图中蓝色矩阵就是输入的图像,粉色矩阵就是卷积层的神经元,这里表示了有两个神经元(w0,w1)。绿色矩阵就是经过卷积运算后的输出矩阵,这里的步长设置为2。 蓝色的矩阵(输入图像)对粉色的矩阵(filter)进行矩阵内积计算并将三个内积运算的结果与偏置值b相加(比如上面图的计算:2+(-2+1-2)+(1-2-2) + 1= 2 - 3 - 3 + 1 = -3),计算后的值就是绿框矩阵的一个元素。 我们正是使用了这样的一种计算方式对输入进行特征提取,并不断加深,加宽网络从而获取更有效的特征表示。 与此同时,卷积还存在另一种特殊结构,反卷积transport-convolution。反卷积对于一个2x2的输入信号,经过3x3 的filters,产生了4x4的feature map。从小的维度产生大的维度,所以transport-convolution又称为上采样卷积。它通常被用来恢复特征的图的大小时使用。 下图为使用多层卷积构成的深度卷积神经网络VGG:

深度卷积生成对抗网络

深度卷积生成对抗网络就是将生成式对抗网络GAN中的生成器G和判别器D中的多层感知机用改进后的卷积神经网络CNN替代形成的。与普通的卷积神经网络不同,它具有如下的特点:

  1. 用步长卷积(判别器)和微步长卷积(生成器)替代任何池化层;
  2. 在生成器和判别器中均使用批规范化;
  3. 为更深层次的架构移除全连接的隐藏层;
  4. 在生成器中,输出层使用Tanh,其余层均使用ReLU激活;
  5. 在判别器中,所有层均使用LeakyReLU激活。

它的生成器结构如图:

我们下面使用pytorch构成DCGANs生成器结构:

  1. class Generator(nn.Module):
  2. def __init__(self, len_Z, hidden_channal, output_channal):
  3. super(Generator, self).__init__()
  4. self.layer1 = nn.Sequential(
  5. nn.ConvTranspose2d(
  6. in_channels=len_Z,
  7. out_channels=hidden_channal * 4,
  8. kernel_size=4,
  9. ),
  10. nn.BatchNorm2d(hidden_channal * 4),
  11. nn.ReLU()
  12. )
  13. # [BATCH, hidden_channal * 4 , 4, 4]
  14. self.layer2 = nn.Sequential(
  15. nn.ConvTranspose2d(
  16. in_channels=hidden_channal * 4,
  17. out_channels=hidden_channal * 2,
  18. kernel_size=3, # 保证生成图像大小为28
  19. stride=2,
  20. padding=1
  21. ),
  22. nn.BatchNorm2d(hidden_channal * 2),
  23. nn.ReLU()
  24. )
  25. #
  26. self.layer3 = nn.Sequential(
  27. nn.ConvTranspose2d(
  28. in_channels=hidden_channal * 2,
  29. out_channels=hidden_channal,
  30. kernel_size=4,
  31. stride=2,
  32. padding=1
  33. ),
  34. nn.BatchNorm2d(hidden_channal),
  35. nn.ReLU()
  36. )
  37. self.layer4 = nn.Sequential(
  38. nn.ConvTranspose2d(
  39. in_channels=hidden_channal,
  40. out_channels=output_channal,
  41. kernel_size=4,
  42. stride=2,
  43. padding=1
  44. ),
  45. nn.Tanh()
  46. )
  47. def forward(self, x):
  48. # [50, 100, 1, 1]
  49. out = self.layer1(x)
  50. # [50, 256, 4, 4]
  51. # print(out.shape)
  52. out = self.layer2(out)
  53. # [50, 128, 7, 7]
  54. # print(out.shape)
  55. out = self.layer3(out)
  56. # [50, 64, 14, 14]
  57. # print(out.shape)
  58. out = self.layer4(out)
  59. # print(out.shape)
  60. # [50, 1, 28, 28]
  61. return out

判别器网络结构为生成器的反向结构,使用卷积完成网络构建,我们给出关键代码:

  1. class Discriminator(nn.Module):
  2. def __init__(self, input_channal, hidden_channal):
  3. super(Discriminator, self).__init__()
  4. self.layer1 = nn.Sequential(
  5. nn.Conv2d(
  6. in_channels=input_channal,
  7. out_channels=hidden_channal,
  8. kernel_size=4,
  9. stride=2,
  10. padding=1
  11. ),
  12. nn.BatchNorm2d(hidden_channal),
  13. nn.LeakyReLU(0.2)
  14. )
  15. self.layer2 = nn.Sequential(
  16. nn.Conv2d(
  17. in_channels=hidden_channal,
  18. out_channels=hidden_channal * 2,
  19. kernel_size=4,
  20. stride=2,
  21. padding=1
  22. ),
  23. nn.BatchNorm2d(hidden_channal * 2),
  24. nn.LeakyReLU(0.2)
  25. )
  26. self.layer3 = nn.Sequential(
  27. nn.Conv2d(
  28. in_channels=hidden_channal * 2,
  29. out_channels=hidden_channal * 4,
  30. kernel_size=3,
  31. stride=2,
  32. padding=1
  33. ),
  34. nn.BatchNorm2d(hidden_channal * 4),
  35. nn.LeakyReLU(0.2)
  36. )
  37. self.layer4 = nn.Sequential(
  38. nn.Conv2d(
  39. in_channels=hidden_channal * 4,
  40. out_channels=1,
  41. kernel_size=4,
  42. stride=1,
  43. padding=0
  44. ),
  45. nn.Sigmoid()
  46. )
  47. # [BATCH, 1, 1, 1]
  48. def forward(self, x):
  49. # print(x.shape)
  50. out = self.layer1(x)
  51. # print(out.shape)
  52. out = self.layer2(out)
  53. # print(out.shape)
  54. out = self.layer3(out)
  55. # print(out.shape)
  56. out = self.layer4(out)
  57. return out

编程要求

根据提示,在右侧编辑器填写判别器,生成器函数,过程包括:

  1. 使用卷积神经网络构建生成器网络
  2. 使用卷积神经网络构建判别器网路
  3. 调用生成器和判别器,并打印网络模型

注,参数设置如下:

  1. # 生成器输入的通道
  2. len_Z = 100
  3. # 生成器的隐藏层通道
  4. g_hidden_channal = 64
  5. # 判别器的隐藏层通道
  6. d_hidden_channal = 64
  7. # 图片的通道
  8. image_channal = 1
  9. # 调用使用cpu
  10. device = torch.device("cpu")
  11. print(G)
  12. print(D)

测试说明

平台会对你编写的代码进行测试:

预期输出:

  1. Generator(
  2. (layer1): Sequential(
  3. (0): ConvTranspose2d(100, 256, kernel_size=(4, 4), stride=(1, 1))
  4. (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  5. (2): ReLU()
  6. )
  7. (layer2): Sequential(
  8. (0): ConvTranspose2d(256, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))
  9. (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  10. (2): ReLU()
  11. )
  12. (layer3): Sequential(
  13. (0): ConvTranspose2d(128, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
  14. (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  15. (2): ReLU()
  16. )
  17. (layer4): Sequential(
  18. (0): ConvTranspose2d(64, 1, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
  19. (1): Tanh()
  20. )
  21. )
  22. Discriminator(
  23. (layer1): Sequential(
  24. (0): Conv2d(1, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
  25. (1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  26. (2): LeakyReLU(negative_slope=0.2)
  27. )
  28. (layer2): Sequential(
  29. (0): Conv2d(64, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1))
  30. (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  31. (2): LeakyReLU(negative_slope=0.2)
  32. )
  33. (layer3): Sequential(
  34. (0): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1))
  35. (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  36. (2): LeakyReLU(negative_slope=0.2)
  37. )
  38. (layer4): Sequential(
  39. (0): Conv2d(256, 1, kernel_size=(4, 4), stride=(1, 1))
  40. (1): Sigmoid()
  41. )
  42. )

参考代码:

  1. import torch
  2. import torch.nn as nn
  3. import torchvision
  4. #########Begin########
  5. # 生成器模型
  6. class Generator(nn.Module):
  7. ##########End#########
  8. def __init__(self, len_z, hidden_channal, output_channal):
  9. super(Generator, self).__init__()
  10. self.layer1 = nn.Sequential(
  11. nn.ConvTranspose2d(
  12. in_channels = len_z,
  13. out_channels = hidden_channal * 4,
  14. kernel_size = 4
  15. ),
  16. nn.BatchNorm2d(hidden_channal * 4),
  17. nn.ReLU()
  18. )
  19. self.layer2 = nn.Sequential(
  20. nn.ConvTranspose2d(
  21. in_channels=hidden_channal * 4,
  22. out_channels=hidden_channal * 2,
  23. kernel_size=3, # 保证生成图像大小为28
  24. stride=2,
  25. padding=1
  26. ),
  27. nn.BatchNorm2d(hidden_channal * 2),
  28. nn.ReLU()
  29. )
  30. self.layer3 = nn.Sequential(
  31. nn.ConvTranspose2d(
  32. in_channels=hidden_channal * 2,
  33. out_channels=hidden_channal,
  34. kernel_size=4,
  35. stride=2,
  36. padding=1
  37. ),
  38. nn.BatchNorm2d(hidden_channal),
  39. nn.ReLU()
  40. )
  41. self.layer4 = nn.Sequential(
  42. nn.ConvTranspose2d(
  43. in_channels=hidden_channal,
  44. out_channels=output_channal,
  45. kernel_size=4,
  46. stride=2,
  47. padding=1
  48. ),
  49. nn.Tanh()
  50. )
  51. def forward(self, x):
  52. out = self.layer1(x)
  53. out = self.layer2(x)
  54. out = self.layer3(x)
  55. out = self.layer4(x)
  56. return out
  57. #########Begin########
  58. # 判别器模型
  59. class Discriminator(nn.Module):
  60. def __init__(self, input_channal, hidden_channal):
  61. super(Discriminator, self).__init__()
  62. self.layer1 = nn.Sequential(
  63. nn.Conv2d(
  64. in_channels = input_channal,
  65. out_channels = hidden_channal,
  66. kernel_size = 4,
  67. stride = 2,
  68. padding = 1
  69. ),
  70. nn.BatchNorm2d(hidden_channal),
  71. nn.LeakyReLU(0.2)
  72. )
  73. self.layer2 = nn.Sequential(
  74. nn.Conv2d(
  75. in_channels=hidden_channal,
  76. out_channels=hidden_channal * 2,
  77. kernel_size=4,
  78. stride=2,
  79. padding=1
  80. ),
  81. nn.BatchNorm2d(hidden_channal * 2),
  82. nn.LeakyReLU(0.2)
  83. )
  84. self.layer3 = nn.Sequential(
  85. nn.Conv2d(
  86. in_channels=hidden_channal * 2,
  87. out_channels=hidden_channal * 4,
  88. kernel_size=3,
  89. stride=2,
  90. padding=1
  91. ),
  92. nn.BatchNorm2d(hidden_channal * 4),
  93. nn.LeakyReLU(0.2)
  94. )
  95. self.layer4 = nn.Sequential(
  96. nn.Conv2d(
  97. in_channels=hidden_channal * 4,
  98. out_channels=1,
  99. kernel_size=4,
  100. stride=1,
  101. padding=0
  102. ),
  103. nn.Sigmoid()
  104. )
  105. def forward(self, x):
  106. out = self.layer1(x)
  107. out = self.layer2(x)
  108. out = self.layer3(x)
  109. out = self.layer4(x)
  110. return out
  111. ##########End#########
  112. # 参数设置
  113. len_Z = 100 # random input.channal for Generator
  114. g_hidden_channal = 64
  115. d_hidden_channal = 64
  116. image_channal = 1 # mnist数据为黑白的只有一维
  117. #########Begin########
  118. # 调用模型
  119. G = Generator(len_Z, g_hidden_channal, image_channal)
  120. D = Discriminator(image_channal, d_hidden_channal)
  121. ##########End#########
  122. device = torch.device("cpu")
  123. print(G)
  124. print(D)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/94347
推荐阅读
相关标签
  

闽ICP备14008679号