Keras - Python深度学习(第二部分)

叁歲伎倆 2023-07-02 03:27 148阅读 0赞

Keras - Python深度学习(第一部分)

Keras - Python深度学习(第二部分)


shuffle和validation_split之间的执行顺序

  1. 模型的fit函数中有两个参数,shuffle用于将数据打乱,validation_split用于在没有提供验证集的时候,按一定比例从训练集中取出一部分作为验证集。
  2. 这里有个陷阱是,程序是先执行validation_split,再执行shuffle的,所以会出现这种情况:假如你的训练集是有序的,比方说正样本在前负样本在后,
  3. 又设置了validation_split,那么你的验证集中很可能将全部是负样本。同样的,这个东西不会有任何错误报出来,因为Keras不可能知道你的数据有没有经过shuffle
  4. 保险起见如果你的数据是没shuffle过的,最好手动shuffle一下

20200125183911164.png


Keras:GAN生成式对抗网络

" class="reference-link">watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 1

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 2

  1. 1.内核大小要能够被步幅大小整除,指的就是内核大小÷strides的结果是商为整数,且余数为零。
  2. 2.被除数、除数、整除的概念
  3. 24÷8=3,其中24是被除数,8为除数。
  4. ab=cb0),用积数c和因数b来求另一个因数a的运算就是除法,写作c÷b,读作c除以b(或bc)。其中,c叫做被除数,b叫做除数,运算的结果a叫做商。
  5. b÷a为整数b除以非零整数a,商为整数,且余数为零, 我们就说b能被a整除(或说a能整除b),b为被除数,a为除数,即a|b(“|”是整除符号),
  6. 读作“a整除b”或“b能被a整除”。a叫做b的约数(或因数),b叫做a的倍数。整除属于除尽的一种特殊情况。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 3

  1. 1.padding='same':填充后输出的宽度和高度与输入的宽度和高度相同
  2. 2.Conv2DTranspose 例子1
  3. 下面转置卷积的输入形状为(None, 14, 14, 64),输出形状为(None, 28, 28, 32),上采样为28×28,转置卷积把输入的宽和高都分别放大了2
  4. x = layers.Conv2DTranspose(32, 3, padding='same', activation='relu', strides=(2, 2))
  5. 3.Conv2DTranspose 例子2
  6. 下面转置卷积的输入形状为(None, 16, 16, 256),输出形状为(None, 32, 32, 256),上采样为32×32,转置卷积把输入的宽和高都分别放大了2
  7. x = layers.Conv2DTranspose(256, 4, strides=2, padding='same')(x)
  8. generator.summary()的打印输出:
  9. _________________________________________________________________
  10. Layer (type) Output Shape Param #
  11. =================================================================
  12. input_1 (InputLayer) (None, 32) 0
  13. _________________________________________________________________
  14. dense_1 (Dense) (None, 32768) 1081344
  15. _________________________________________________________________
  16. leaky_re_lu_1 (LeakyReLU) (None, 32768) 0
  17. _________________________________________________________________
  18. reshape_1 (Reshape) (None, 16, 16, 128) 0
  19. _________________________________________________________________
  20. conv2d_1 (Conv2D) (None, 16, 16, 256) 819456
  21. _________________________________________________________________
  22. leaky_re_lu_2 (LeakyReLU) (None, 16, 16, 256) 0
  23. _________________________________________________________________
  24. conv2d_transpose_1 (Conv2DTr (None, 32, 32, 256) 1048832
  25. _________________________________________________________________
  26. leaky_re_lu_3 (LeakyReLU) (None, 32, 32, 256) 0
  27. _________________________________________________________________
  28. conv2d_2 (Conv2D) (None, 32, 32, 256) 1638656
  29. _________________________________________________________________
  30. leaky_re_lu_4 (LeakyReLU) (None, 32, 32, 256) 0
  31. _________________________________________________________________
  32. conv2d_3 (Conv2D) (None, 32, 32, 256) 1638656
  33. _________________________________________________________________
  34. leaky_re_lu_5 (LeakyReLU) (None, 32, 32, 256) 0
  35. _________________________________________________________________
  36. conv2d_4 (Conv2D) (None, 32, 32, 3) 37635
  37. =================================================================

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 4

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 5

  1. discriminator.summary()的打印输出:
  2. _________________________________________________________________
  3. Layer (type) Output Shape Param #
  4. =================================================================
  5. input_2 (InputLayer) (None, 32, 32, 3) 0
  6. _________________________________________________________________
  7. conv2d_5 (Conv2D) (None, 30, 30, 128) 3584
  8. _________________________________________________________________
  9. leaky_re_lu_6 (LeakyReLU) (None, 30, 30, 128) 0
  10. _________________________________________________________________
  11. conv2d_6 (Conv2D) (None, 14, 14, 128) 262272
  12. _________________________________________________________________
  13. leaky_re_lu_7 (LeakyReLU) (None, 14, 14, 128) 0
  14. _________________________________________________________________
  15. conv2d_7 (Conv2D) (None, 6, 6, 128) 262272
  16. _________________________________________________________________
  17. leaky_re_lu_8 (LeakyReLU) (None, 6, 6, 128) 0
  18. _________________________________________________________________
  19. conv2d_8 (Conv2D) (None, 2, 2, 128) 262272
  20. _________________________________________________________________
  21. leaky_re_lu_9 (LeakyReLU) (None, 2, 2, 128) 0
  22. _________________________________________________________________
  23. flatten_1 (Flatten) (None, 512) 0
  24. _________________________________________________________________
  25. dropout_1 (Dropout) (None, 512) 0
  26. _________________________________________________________________
  27. dense_2 (Dense) (None, 1) 513
  28. =================================================================

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 6

  1. 如何“冻结”网络的层?
  2. 1.“冻结”一个层指的是该层将不参加网络训练,即该层的权重永不会更新。在进行fine-tune时我们经常会需要这项操作。
  3. 在使用固定的embedding层处理文本输入时,也需要这个技术。
  4. 2.可以通过向层的构造函数传递trainable参数来指定一个层是不是可训练的,如:frozen_layer = Dense(32,trainable=False)
  5. 3.此外,也可以通过将层对象的trainable属性设为TrueFalse来为已经搭建好的模型设置要冻结的层。
  6. 在设置完后,需要运行compile来使设置生效,例如:
  7. x = Input(shape=(32,))
  8. layer = Dense(32)
  9. layer.trainable = False
  10. y = layer(x)
  11. frozen_model = Model(x, y)
  12. #在下面的模型中,“layer”的权重在训练期间不会更新
  13. frozen_model.compile(optimizer='rmsprop', loss='mse')
  14. layer.trainable = True
  15. trainable_model = Model(x, y)
  16. #使用此模型,训练期间将更新层的权重,修改配置后需要重新运行compile来使设置生效
  17. #这也将影响上述模型,因为它使用相同的层实例
  18. trainable_model.compile(optimizer='rmsprop', loss='mse')
  19. frozen_model.fit(data, labels) #这不会更新“layer”的权重`
  20. trainable_model.fit(data, labels) #这将更新“layer”的权重`
  21. 1.构建Model模型的实例对象model
  22. from keras.models import Model
  23. model = Model(input,output)
  24. 1.xx模型实例化出一个model对象,它将一个模型输入input映射为一个模型输出output
  25. 或者说可以理解为把一个模型输入input映射为一个包含多层的整体的模型。
  26. 2.模型输入input可以是 keras.Input(shape)、layers.Input(shape)。
  27. 3.模型输出output
  28. 可以是一个自定义类的实例对象:class 自定义类名(keras.layers.Layer)的实例对象。
  29. 也可以是一个包含多层layers的模型输出:output=layers.xxx(参数)(上一层layers)。
  30. 也可以是一个模型实例对象:output=keras.models.Model(input,output)。比如构建GAN模型的例子。
  31. 2.model实例对象的多种使用形式
  32. 1.output = model(input)
  33. model实例对象传入真实的模型输入数据,输出对应的目标数据
  34. input为真实的模型输入,output为模型输出
  35. 2.model.fit(x=x_train, y=y_train, shuffle=True, epochs=10, batch_size=batch_size, validation_data=(x_test, y_test))
  36. model实例对象直接进行fit训练,传入用于训练/验证的模型输入和模型输出,可以同时指定shuffle/epochs/batch_size
  37. 3.output = Model实例对象2(Model模型实例对象1(input))
  38. 多个Model实例对象进行嵌套连接在一起构建为一个新的网络模型,即Model模型1的输出作为Model模型2的输入。
  39. 比如GAN模型中,便把生成器网络模型的实例对象和判别器网络模型的实例对象连接在一起构建为一个新的模型,最终返回判别器网络的模型输出。
  40. 3.keras.layers.Layer层:output = layers.Conv2D()/layers.Dense()/layers.Conv2DTranspose()/...
  41. 自定义keras.layers.Layer层的形式:
  42. 1.class 自定义类名(keras.layers.Layer):
  43. def call(self, inputs):
  44. #可以不使用这个返回输出值,但层必须要有返回值
  45. return x
  46. 2.创建自定义Layer层的实例对象:output = 自定义类名(inputs)
  47. 4.GAN 生成器网络 GAN 判别器网络 的组合
  48. 1.GAN 生成器网络
  49. #设置模型输入是一个形状为 (latent_dim,)的随机向量(潜在空间中的一个随机点)
  50. generator_input = keras.Input(shape=(latent_dim,))
  51. x = layers.Dense(128 * 16 * 16)(generator_input)
  52. #构建连续多层layers.Dense/layers.LeakyReLU/layers.Conv2D/layers.Reshape等
  53. ......
  54. #构建生成器模型实例对象:把形状为 (latent_dim,)的随机向量(潜在空间中的一个随机点)作为模型输入,
  55. #映射到一个包含多层layers的模型输出网络,最终解码为一张形状为 (32, 32, 3) 的合成图像
  56. generator = keras.models.Model(generator_input, x)
  57. #注意此处的generator并没有执行keras.optimizers.RMSprop和compile
  58. generator.summary()
  59. _________________________________________________________________
  60. Layer (type) Output Shape Param #
  61. =================================================================
  62. input_1 (InputLayer) (None, 32) 0
  63. _________________________________________________________________
  64. dense_1 (Dense) (None, 32768) 1081344
  65. _________________________________________________________________
  66. leaky_re_lu_1 (LeakyReLU) (None, 32768) 0
  67. _________________________________________________________________
  68. reshape_1 (Reshape) (None, 16, 16, 128) 0
  69. _________________________________________________________________
  70. conv2d_1 (Conv2D) (None, 16, 16, 256) 819456
  71. _________________________________________________________________
  72. leaky_re_lu_2 (LeakyReLU) (None, 16, 16, 256) 0
  73. _________________________________________________________________
  74. conv2d_transpose_1 (Conv2DTr (None, 32, 32, 256) 1048832
  75. _________________________________________________________________
  76. leaky_re_lu_3 (LeakyReLU) (None, 32, 32, 256) 0
  77. _________________________________________________________________
  78. conv2d_2 (Conv2D) (None, 32, 32, 256) 1638656
  79. _________________________________________________________________
  80. leaky_re_lu_4 (LeakyReLU) (None, 32, 32, 256) 0
  81. _________________________________________________________________
  82. conv2d_3 (Conv2D) (None, 32, 32, 256) 1638656
  83. _________________________________________________________________
  84. leaky_re_lu_5 (LeakyReLU) (None, 32, 32, 256) 0
  85. _________________________________________________________________
  86. conv2d_4 (Conv2D) (None, 32, 32, 3) 37635
  87. =================================================================
  88. Total params: 6,264,579
  89. Trainable params: 6,264,579
  90. Non-trainable params: 0
  91. _________________________________________________________________
  92. 2.GAN 判别器网络
  93. discriminator_input = layers.Input(shape=(height, width, channels))
  94. x = layers.Conv2D(128, 3)(discriminator_input)
  95. #构建连续多层layers.Dense/layers.LeakyReLU/layers.Conv2D/layers.Flatten/layers.Dropout等
  96. ......
  97. #构建判别器模型实例对象:把形状为(32, 32, 3)的图像作为模型输入,映射到一个包含多层layers的模型输出网络,
  98. #最终转换为一个二进制分类决策(即分类为真/假)
  99. discriminator = keras.models.Model(discriminator_input, x)
  100. #clipvalue在优化器中使用梯度裁剪(限制梯度值的范围),decay为了稳定训练过程,使用学习率衰减
  101. discriminator_optimizer = keras.optimizers.RMSprop(lr=0.0008, clipvalue=1.0, decay=1e-8)
  102. discriminator.compile(optimizer=discriminator_optimizer, loss='binary_crossentropy')
  103. discriminator.summary()
  104. _________________________________________________________________
  105. Layer (type) Output Shape Param #
  106. =================================================================
  107. input_2 (InputLayer) (None, 32, 32, 3) 0
  108. _________________________________________________________________
  109. conv2d_5 (Conv2D) (None, 30, 30, 128) 3584
  110. _________________________________________________________________
  111. leaky_re_lu_6 (LeakyReLU) (None, 30, 30, 128) 0
  112. _________________________________________________________________
  113. conv2d_6 (Conv2D) (None, 14, 14, 128) 262272
  114. _________________________________________________________________
  115. leaky_re_lu_7 (LeakyReLU) (None, 14, 14, 128) 0
  116. _________________________________________________________________
  117. conv2d_7 (Conv2D) (None, 6, 6, 128) 262272
  118. _________________________________________________________________
  119. leaky_re_lu_8 (LeakyReLU) (None, 6, 6, 128) 0
  120. _________________________________________________________________
  121. conv2d_8 (Conv2D) (None, 2, 2, 128) 262272
  122. _________________________________________________________________
  123. leaky_re_lu_9 (LeakyReLU) (None, 2, 2, 128) 0
  124. _________________________________________________________________
  125. flatten_1 (Flatten) (None, 512) 0
  126. _________________________________________________________________
  127. dropout_1 (Dropout) (None, 512) 0
  128. _________________________________________________________________
  129. dense_2 (Dense) (None, 1) 513
  130. =================================================================
  131. Total params: 790,913
  132. Trainable params: 790,913
  133. Non-trainable params: 0
  134. _________________________________________________________________
  135. 3.把生成器网络和判别器网络连接在一起构建一个完整的GAN
  136. #1.将判别器网络的权重设置为不可训练(仅应用于GAN模型),这样在训练时判别器网络的权重便不会更新,
  137. # 否则在训练时可以对判别器的权重进行更新的话,则会导致训练判别器始终预测“真”,但这并不是想要的效果。
  138. #2.因为在前面定义判别器网络的时候其trainable默认为True的,此处修改为False之后,因为没有再次执行discriminator.compile,而是执行了gan.compile,
  139. # 所以并不会影响判别器网络执行discriminator.train_on_batch进行批量训练时更新判别器网络权重的,
  140. # 仅会影响执行gan.train_on_batch进行批量训练时不会更新判别器网络的权重,
  141. # 实际gan进行批量训练时是靠所计算的判别器网络的损失和梯度作为反馈来训练生成器网络的。
  142. discriminator.trainable = False
  143. #把形状为 (latent_dim,)的随机向量(潜在空间中的一个随机点)作为模型输入
  144. gan_input = keras.Input(shape=(latent_dim,))
  145. #把生成器网络模型的实例对象 和 判别器网络模型的实例对象 连接在一起构建为一个新的模型,最终返回判别器网络的模型输出
  146. gan_output = discriminator(generator(gan_input))
  147. #构建完整的GAN模型:将形状为 (latent_dim,)的随机向量(潜在空间中的一个随机点)作为模型输入,先通过生成器网络输出为(None, 32, 32, 3)的合成图像,
  148. #然后把生成合成图像输入到判别器网络中,最终模型输出转换为一个分类决策(即分类为真/假)。
  149. #但要注意的是GAN模型此处训练时的标签虽然都是设置为“真实图像”,但训练的样本实际都是“根据潜在空间中再次进行采样的随机点(随机噪声)所生成的”合成图像,
  150. #而标签却要标识为“真实图像”,这是在撒谎。训练过程中需要将判别器设置为冻结(即不可训练),这样在训练 gan 时它的权重才不会更新。
  151. #因此,训练 gan 将会更新生成器的权重,使得判别器在观察假图像时更有可能预测为“真”。
  152. #如果在此过程中可以对判别器的权重进行更新,那么我们就是在训练判别器始终预测“真”,但这并不是我们想要的!
  153. #训练时,这个模型将让生成器向某个方向移动,从而提高它欺骗判别器的能力。
  154. gan = keras.models.Model(gan_input, gan_output)
  155. gan.summary()
  156. #clipvalue在优化器中使用梯度裁剪(限制梯度值的范围),decay为了稳定训练过程,使用学习率衰减
  157. gan_optimizer = keras.optimizers.RMSprop(lr=0.0004, clipvalue=1.0, decay=1e-8)
  158. gan.compile(optimizer=gan_optimizer, loss='binary_crossentropy')
  159. _________________________________________________________________
  160. Layer (type) Output Shape Param #
  161. =================================================================
  162. input_3 (InputLayer) (None, 32) 0
  163. _________________________________________________________________
  164. model_1 (Model) (None, 32, 32, 3) 6264579
  165. _________________________________________________________________
  166. model_2 (Model) (None, 1) 790913
  167. =================================================================
  168. Total params: 7,055,492
  169. Trainable params: 6,264,579 表示生成器网络权重在训练时会进行更新
  170. Non-trainable params: 790,913 表示判别器网络权重在训练时不会进行更新
  171. _________________________________________________________________
  172. for layer in gan.layers:
  173. print(layer.name, layer.trainable)
  174. #input_3 False
  175. #model_1 True 表示生成器网络权重在训练时会进行更新
  176. #model_2 False 表示判别器网络权重在训练时不会进行更新
  177. 4.训练 DCGAN
  178. import keras
  179. from keras import layers
  180. from keras import backend as K
  181. from keras.models import Model
  182. import numpy as np
  183. import os
  184. from keras.preprocessing import image
  185. #潜在空间中的一个随机点的维度
  186. latent_dim = 32
  187. height = 32
  188. width = 32
  189. channels = 3
  190. #迭代次数
  191. iterations = 10000
  192. batch_size = 20
  193. #指定保存生成图像的目录
  194. save_dir = 'your_dir'
  195. #加载 CIFAR10数据
  196. (x_train, y_train), (_, _) = keras.datasets.cifar10.load_data()
  197. #只选择青蛙图像(类别编号为6),那么x_train所包含的训练图像便只包含青蛙图像
  198. x_train = x_train[y_train.flatten() == 6]
  199. #x_train.shape为(5000, 32, 32, 3),5000个青蛙样本图像,并进行数据标准化
  200. x_train = x_train.reshape((x_train.shape[0],) +(height, width, channels)).astype('float32') / 255.
  201. #1.生成器从未直接见过训练集中的图像,它所知道的关于数据的信息都来自于判别器的反馈。
  202. #2.GAN 学习的潜在空间没有整齐的连续结构,因此可能不适用于某些实际应用,比如通过潜在空间概念向量进行图像编辑。
  203. start = 0
  204. for step in range(iterations):
  205. ############################
  206. #更新判别器网络的损失: 最大化maximize log(D(x)) + log(1 - D(G(z)))
  207. # 第一步:generator.predict生成器网络根据随机噪音预测生成的合成图像数据,此预测输出数据并不会包含生成器网络这一层本身。
  208. # 第二步:discriminator.train_on_batch批量训练同时使用真实图片和真实图像标签与合成图像和合成图像标签来训练判别器网络,
  209. # 此时会对判别器网络进行计算损失和梯度,以此来优化判别器网络,真正改变调整判别器网络的学习参数。
  210. ############################
  211. #在潜在空间中采样形状为(20, 32)的随机点(随机噪声),该随机点的形状实际为(latent_dim,)的随机向量
  212. random_latent_vectors = np.random.normal(size=(batch_size, latent_dim))
  213. #生成器网络利用这个随机噪声生成合成图像,即将20个潜在空间中的随机点(随机向量)解码为虚假图像。
  214. #生成器网络模型输入InputLayer接收的数据形状是(20, 32),而输出的数据是(20, 32, 32, 3)形状的合成图像。
  215. generated_images = generator.predict(random_latent_vectors)
  216. #每次迭代都从x_train中取batch_size个不同的青蛙样本图像
  217. stop = start + batch_size
  218. real_images = x_train[start: stop]
  219. #将生成的(20, 32, 32, 3)形状的合成图像 与 (20, 32, 32, 3)形状的真实图像混合
  220. #默认axis=0为第一个轴进行合并,即批量大小的该轴上合并为(40, 32, 32, 3)
  221. combined_images = np.concatenate([generated_images, real_images])
  222. #使用这些混合后的真假图像以及相应的标签(合成图像为“假”对应值1,真实图像为“真”对应值0)来训练判别器网络
  223. labels = np.concatenate([np.ones((batch_size, 1)),np.zeros((batch_size, 1))])
  224. #向合并标签中添加随机噪声,合成图像对应的标签值为1的变成1.xx左右,真实图像对应的标签值为0的变成0.xx左右
  225. labels += 0.05 * np.random.random(labels.shape)
  226. #1.判别器批量进行训练,合并的两种真假图像和真假标签进行训练,返回判别损失
  227. #2.训练时你可能会看到,对抗损失a_loss开始大幅增加,而判别损失d_loss则趋向于零,即判别器d_loss最终支配了生成器。
  228. # 如果出现了这种情况,你可以尝试减小判别器的学习率,并增大判别器的 dropout比率。
  229. d_loss = discriminator.train_on_batch(combined_images, labels)
  230. ############################
  231. #更新生成器网络的损失: 最大化maximize log(D(G(z)))
  232. # 1.gan.train_on_batch基于判别器网络的反馈来训练生成器网络,注意此处gan中的判别器网络的权重被冻结了,
  233. # 因此判别器网络的权重不会更新,而生成器网络的权重才会更新。
  234. # 使用这些随机向量所生成的合成图像和伪造的“真实图像”的标签来最终训练生成器来计算出对应的损失和梯度,
  235. # 然后根据这些训练生成器所计算出对应的损失和梯度的反馈来以此训练生成器网络,
  236. # 要知道生成器从未直接见过训练集中的图像,它所知道的关于数据的信息都来自于判别器的反馈。
  237. # 2.在定义判别器网络时,trainable 默认为True的,然后执行的discriminator.compile,
  238. # 所以单纯使用discriminator.train_on_batch时是会更新判别器网络的权限的。
  239. # 3.由于在定义gan模型时,是先执行discriminator.trainable=False,用于冻结判别器网络的权重的,
  240. # 但后面并没有执行discriminator.compile,而是执行了gan.compile,
  241. # 因此只会影响gan训练中的判别器网络不会更新其权重,而执行discriminator.train_on_batch训练判别器网络时,
  242. # 是不会受影响的。
  243. # 4.因为在前面定义判别器网络的时候其trainable默认为True的,此处修改为False之后,因为没有再次执行discriminator.compile,
  244. # 而是执行了gan.compile,所以并不会影响判别器网络执行discriminator.train_on_batch进行批量训练时更新判别器网络权重的,
  245. # 仅会影响执行gan.train_on_batch进行批量训练时不会更新判别器网络的权重,
  246. # 实际gan进行批量训练时是靠所计算的判别器网络的损失和梯度作为反馈来训练生成器网络的。
  247. ###########################
  248. #同一次的迭代中在潜在空间中再次进行采样形状为(20, 32)的随机点(随机噪声),该随机点的形状实际为(latent_dim,)的随机向量
  249. random_latent_vectors = np.random.normal(size=(batch_size, latent_dim))
  250. #设置GAN训练时的标签都是“真实图像”(实际这是在撒谎,GAN训练的样本实际都是“根据潜在空间中再次进行采样的随机点(随机噪声)所生成的”合成图像),
  251. #同时设置“真实图像”对应的标签值为0
  252. misleading_targets = np.zeros((batch_size, 1))
  253. #利用这些由随机向量所生成的合成图像以及全部是“真实图像”的标签(这是在撒谎)来训练 gan。
  254. #只会更新生成器的权重,而判别器在gan中被冻结,其更新方向是使得判别器能够将合成图像预测为“真实图像”。这个过程是训练生成器去欺骗判别器。
  255. #通过GAN模型来训练生成器(此时的判别器被冻结了权重),此时对采样随机点(合成图像)和“真”标签(实际为假标签)进行训练,返回对抗损失
  256. a_loss = gan.train_on_batch(random_latent_vectors, misleading_targets)
  257. start += batch_size
  258. if start > len(x_train) - batch_size:
  259. start = 0
  260. #每 100 步保存并绘图
  261. if step % 100 == 0:
  262. #保存模型权重
  263. gan.save_weights('gan.h5')
  264. #将指标打印出来
  265. print('discriminator loss at step %s: %s' % (step, d_loss))
  266. print('adversarial loss at step %s: %s' % (step, a_loss))
  267. #保存一张合成图像
  268. img = image.array_to_img(generated_images[0] * 255., scale=False)
  269. img.save(os.path.join(save_dir, 'generated_frog' + str(step) + '.png'))
  270. #保存一张真实图像,用于对比
  271. img = image.array_to_img(real_images[0] * 255., scale=False)
  272. img.save(os.path.join(save_dir, 'real_frog' + str(step) + '.png'))
  273. 5.使用训练好的 DCGAN进行预测
  274. import matplotlib.pyplot as plt
  275. #潜在空间中的样本随机点
  276. random_latent_vectors = np.random.normal(size=(10, latent_dim))
  277. #解码成假图像
  278. generated_images = generator.predict(random_latent_vectors)
  279. for i in range(generated_images.shape[0]):
  280. img = image.array_to_img(generated_images[i] * 255., scale=False)
  281. plt.figure()
  282. plt.imshow(img)
  283. plt.show()
  284. discriminator loss at step 0: 0.7115288
  285. adversarial loss at step 0: 0.7047467
  286. discriminator loss at step 100: 0.63698226
  287. adversarial loss at step 100: 1.2898037
  288. discriminator loss at step 200: 0.7468196
  289. adversarial loss at step 200: 0.7246065
  290. discriminator loss at step 300: 0.6819771
  291. adversarial loss at step 300: 0.8227237
  292. discriminator loss at step 400: 0.7036969
  293. adversarial loss at step 400: 0.7419513
  294. discriminator loss at step 500: 0.69924504
  295. adversarial loss at step 500: 0.734193
  296. discriminator loss at step 600: 0.69154274
  297. adversarial loss at step 600: 0.7261149
  298. discriminator loss at step 700: 0.7011696
  299. adversarial loss at step 700: 0.7488779
  300. discriminator loss at step 800: 0.68115616
  301. adversarial loss at step 800: 0.7672018
  302. discriminator loss at step 900: 0.6855592
  303. adversarial loss at step 900: 0.74231493
  304. discriminator loss at step 1000: 0.69031733
  305. adversarial loss at step 1000: 0.74285185
  306. discriminator loss at step 1100: 0.6905447
  307. adversarial loss at step 1100: 0.75708795
  308. discriminator loss at step 1200: 0.69429624
  309. adversarial loss at step 1200: 0.7909092
  310. discriminator loss at step 1300: 0.7032337
  311. adversarial loss at step 1300: 0.7317235
  312. discriminator loss at step 1400: 0.70822525
  313. adversarial loss at step 1400: 0.7645156
  314. discriminator loss at step 1500: 0.70326895
  315. adversarial loss at step 1500: 0.7963195
  316. discriminator loss at step 1600: 0.70500505
  317. adversarial loss at step 1600: 0.76147723
  318. discriminator loss at step 1700: 0.68592215
  319. adversarial loss at step 1700: 0.73715556
  320. discriminator loss at step 1800: 0.6949235
  321. adversarial loss at step 1800: 0.7374927
  322. discriminator loss at step 1900: 0.6858417
  323. adversarial loss at step 1900: 0.7386305
  324. discriminator loss at step 2000: 0.70051277
  325. adversarial loss at step 2000: 0.7732838
  326. discriminator loss at step 2100: 0.6938835
  327. adversarial loss at step 2100: 0.74504554
  328. discriminator loss at step 2200: 0.75744766
  329. adversarial loss at step 2200: 0.79670256
  330. discriminator loss at step 2300: 0.68921125
  331. adversarial loss at step 2300: 0.7624829
  332. discriminator loss at step 2400: 0.68788964
  333. adversarial loss at step 2400: 0.73603165
  334. discriminator loss at step 2500: 0.72942907
  335. adversarial loss at step 2500: 0.8500789
  336. discriminator loss at step 2600: 0.7144539
  337. adversarial loss at step 2600: 0.7313472
  338. discriminator loss at step 2700: 0.70036346
  339. adversarial loss at step 2700: 0.7659265
  340. discriminator loss at step 2800: 0.71731293
  341. adversarial loss at step 2800: 0.7386481
  342. discriminator loss at step 2900: 0.6962636
  343. adversarial loss at step 2900: 0.82014436
  344. discriminator loss at step 3000: 0.70221204
  345. adversarial loss at step 3000: 0.7448746
  346. discriminator loss at step 3100: 0.6970533
  347. adversarial loss at step 3100: 0.7414106
  348. discriminator loss at step 3200: 0.7027217
  349. adversarial loss at step 3200: 0.7593067
  350. discriminator loss at step 3300: 0.6974826
  351. adversarial loss at step 3300: 0.77101165
  352. discriminator loss at step 3400: 0.69468534
  353. adversarial loss at step 3400: 0.7360735
  354. discriminator loss at step 3500: 0.6959646
  355. adversarial loss at step 3500: 0.7448656
  356. discriminator loss at step 3600: 0.6926605
  357. adversarial loss at step 3600: 0.7793437
  358. discriminator loss at step 3700: 0.68845165
  359. adversarial loss at step 3700: 0.73707116
  360. discriminator loss at step 3800: 0.6896309
  361. adversarial loss at step 3800: 0.72898376
  362. discriminator loss at step 3900: 0.6803684
  363. adversarial loss at step 3900: 0.8558714
  364. discriminator loss at step 4000: 0.69410855
  365. adversarial loss at step 4000: 0.7726719
  366. discriminator loss at step 4100: 0.69593436
  367. adversarial loss at step 4100: 0.78482276
  368. discriminator loss at step 4200: 0.6936628
  369. adversarial loss at step 4200: 0.77395284
  370. discriminator loss at step 4300: 0.728613
  371. adversarial loss at step 4300: 0.8212582
  372. discriminator loss at step 4400: 0.7129141
  373. adversarial loss at step 4400: 0.7208406
  374. discriminator loss at step 4500: 0.69421184
  375. adversarial loss at step 4500: 0.79397744
  376. discriminator loss at step 4600: 0.6970722
  377. adversarial loss at step 4600: 0.74527484
  378. discriminator loss at step 4700: 0.68375814
  379. adversarial loss at step 4700: 0.74301445
  380. discriminator loss at step 4800: 0.6913597
  381. adversarial loss at step 4800: 0.747694
  382. discriminator loss at step 4900: 0.6858412
  383. adversarial loss at step 4900: 0.78235567
  384. discriminator loss at step 5000: 0.69061077
  385. adversarial loss at step 5000: 0.736558
  386. discriminator loss at step 5100: 0.6893281
  387. adversarial loss at step 5100: 0.6763943
  388. discriminator loss at step 5200: 0.8067726
  389. adversarial loss at step 5200: 0.86751175
  390. discriminator loss at step 5300: 0.6935332
  391. adversarial loss at step 5300: 0.9220335
  392. discriminator loss at step 5400: 0.6804237
  393. adversarial loss at step 5400: 0.8375907
  394. discriminator loss at step 5500: 0.69301045
  395. adversarial loss at step 5500: 0.7437799
  396. discriminator loss at step 5600: 0.6772412
  397. adversarial loss at step 5600: 0.79126954
  398. discriminator loss at step 5700: 0.7131443
  399. adversarial loss at step 5700: 0.7175739
  400. discriminator loss at step 5800: 0.6722745
  401. adversarial loss at step 5800: 0.9802745
  402. discriminator loss at step 5900: 0.7032528
  403. adversarial loss at step 5900: 0.74221563
  404. discriminator loss at step 6000: 0.7101313
  405. adversarial loss at step 6000: 0.7202954
  406. discriminator loss at step 6100: 0.6840765
  407. adversarial loss at step 6100: 0.7130268
  408. discriminator loss at step 6200: 0.6932604
  409. adversarial loss at step 6200: 0.8000577
  410. discriminator loss at step 6300: 0.7109294
  411. adversarial loss at step 6300: 0.76588863
  412. discriminator loss at step 6400: 0.7001274
  413. adversarial loss at step 6400: 0.74738723
  414. discriminator loss at step 6500: 0.6741629
  415. adversarial loss at step 6500: 0.80781347
  416. discriminator loss at step 6600: 0.7539159
  417. adversarial loss at step 6600: 0.42317972
  418. discriminator loss at step 6700: 0.6927122
  419. adversarial loss at step 6700: 0.73476046
  420. discriminator loss at step 6800: 0.6664301
  421. adversarial loss at step 6800: 0.34711856
  422. discriminator loss at step 6900: 0.70018405
  423. adversarial loss at step 6900: 0.73765796
  424. discriminator loss at step 7000: 0.715394
  425. adversarial loss at step 7000: 0.780943
  426. discriminator loss at step 7100: 0.6959831
  427. adversarial loss at step 7100: 0.78711915
  428. discriminator loss at step 7200: 0.6889924
  429. adversarial loss at step 7200: 0.76479584
  430. discriminator loss at step 7300: 0.6871983
  431. adversarial loss at step 7300: 0.74707294
  432. discriminator loss at step 7400: 0.6960098
  433. adversarial loss at step 7400: 0.79496956
  434. discriminator loss at step 7500: 0.74034274
  435. adversarial loss at step 7500: 0.7176825
  436. discriminator loss at step 7600: 0.69009006
  437. adversarial loss at step 7600: 0.75234497
  438. discriminator loss at step 7700: 0.6819211
  439. adversarial loss at step 7700: 0.8833235
  440. discriminator loss at step 7800: 0.6769482
  441. adversarial loss at step 7800: 0.83547515
  442. discriminator loss at step 7900: 0.79681766
  443. adversarial loss at step 7900: 0.5486014
  444. discriminator loss at step 8000: 0.69123125
  445. adversarial loss at step 8000: 0.7945508
  446. discriminator loss at step 8100: 0.698786
  447. adversarial loss at step 8100: 0.752495
  448. discriminator loss at step 8200: 0.700045
  449. adversarial loss at step 8200: 0.74887985
  450. discriminator loss at step 8300: 0.67619663
  451. adversarial loss at step 8300: 0.74648297
  452. discriminator loss at step 8400: 0.70129263
  453. adversarial loss at step 8400: 1.0010253
  454. discriminator loss at step 8500: 0.6581225
  455. adversarial loss at step 8500: 0.79142404
  456. discriminator loss at step 8600: 0.641611
  457. adversarial loss at step 8600: 0.7367972
  458. discriminator loss at step 8700: 0.72519004
  459. adversarial loss at step 8700: 1.2603848
  460. discriminator loss at step 8800: 0.7795755
  461. adversarial loss at step 8800: 1.4261863
  462. discriminator loss at step 8900: 0.6901215
  463. adversarial loss at step 8900: 0.76327527
  464. discriminator loss at step 9000: 0.6633209
  465. adversarial loss at step 9000: 0.79276145
  466. discriminator loss at step 9100: 0.6700674
  467. adversarial loss at step 9100: 0.79978144
  468. discriminator loss at step 9200: 0.71044004
  469. adversarial loss at step 9200: 0.8300269
  470. discriminator loss at step 9300: 0.6278731
  471. adversarial loss at step 9300: 1.067949
  472. discriminator loss at step 9400: 0.7122105
  473. adversarial loss at step 9400: 0.9927448
  474. discriminator loss at step 9500: 0.6827091
  475. adversarial loss at step 9500: 0.7850563
  476. discriminator loss at step 9600: 0.6800372
  477. adversarial loss at step 9600: 0.85021067
  478. discriminator loss at step 9700: 0.70892954
  479. adversarial loss at step 9700: 0.73444927
  480. discriminator loss at step 9800: 0.67502975
  481. adversarial loss at step 9800: 0.89363736
  482. discriminator loss at step 9900: 0.8730275
  483. adversarial loss at step 9900: 0.81281984

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 7

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 8

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 9


PyTorch:GAN生成式对抗网络

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 10

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 11

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 12

  1. import os
  2. from torchvision import datasets
  3. from torch.utils.data import DataLoader
  4. import torch.nn as nn
  5. import torch
  6. from torch.autograd import Variable
  7. import torch.optim as optim
  8. import torchvision.transforms as transforms
  9. import matplotlib.pyplot as plt
  10. from PIL import Image
  11. import torchvision.utils as vutils
  12. %matplotlib inline
  13. img_size = 64
  14. batch_size=64
  15. lr = 0.0002
  16. beta1 = 0.5
  17. niter= 25
  18. outf= 'output'
  19. #加载CIFAR10数据
  20. dataset = datasets.CIFAR10( root = 'data',download=True,
  21. transform=transforms.Compose([
  22. transforms.Resize(img_size),
  23. transforms.ToTensor(),
  24. transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),
  25. ]))
  26. dataloader = torch.utils.data.DataLoader(dataset, batch_size, shuffle=True)
  27. #latnet向量的大小
  28. nz = 100
  29. #generator过滤器尺寸
  30. ngf = 64
  31. #discriminator过滤器尺寸
  32. ndf = 64
  33. #输出图像通道
  34. nc = 3
  35. #网络初始化。在netG和netD上调用自定义权重初始化。
  36. def weights_init(m):
  37. classname = m.__class__.__name__
  38. if classname.find('Conv') != -1:
  39. m.weight.data.normal_(0.0, 0.02)
  40. elif classname.find('BatchNorm') != -1:
  41. m.weight.data.normal_(1.0, 0.02)
  42. m.bias.data.fill_(0)
  43. #1.nn.Conv2d(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True))
  44. # 参数:
  45. #   in_channel:输入数据的通道数,例RGB图片通道数为3;
  46. #   out_channel:输出数据的通道数,这个根据模型调整;
  47. #   kennel_size:卷积核大小,可以是int,或tuple;kennel_size=2,意味着卷积大小2,kennel_size=(2,3),
  48. # 意味着卷积在第一维度大小为2,在第二维度大小为3;
  49. #   stride:步长,默认为1,与kennel_size类似,stride=2,意味在所有维度步长为2,stride=(2,3),
  50. # 意味着在第一维度步长为2,意味着在第二维度步长为3;
  51. #   padding:零填充
  52. #
  53. #2.nn.Conv2d(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True))
  54. # 参数:
  55. #   in_channel:输入数据的通道数,例RGB图片通道数为3;
  56. #   out_channel:输出数据的通道数,这个根据模型调整;
  57. #   kennel_size:卷积核大小,可以是int,或tuple;kennel_size=2,意味着卷积大小(2,2),kennel_size=(2,3),
  58. # 意味着卷积大小(2,3) 即非正方形卷积
  59. #   stride:步长,默认为1,与kennel_size类似,stride=2,意味着步长上下左右扫描皆为2,stride=(2,3),左右扫描步长为2,上下为3;
  60. #   padding:零填充
  61. #定义生成网络
  62. class _netG(nn.Module):
  63. def __init__(self):
  64. super(_netG, self).__init__()
  65. self.main = nn.Sequential(
  66. #输入通道数nz=100(latnet向量的大小),输出通道数64*8=512
  67. nn.ConvTranspose2d(nz, ngf * 8, 4, 1, 0, bias=False),
  68. nn.BatchNorm2d(ngf * 8),
  69. nn.ReLU(True),
  70. #输入通道数64*8=512,过滤器大小512x4x4,输出通道数64*4=256
  71. #上采样为8×8,(步幅2)转置卷积把输入的宽和高都分别放大了2倍
  72. nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, bias=False),
  73. nn.BatchNorm2d(ngf * 4),
  74. nn.ReLU(True),
  75. #输入通道数64*4=256,过滤器大小256x8x8,输出通道数64*2=128
  76. #上采样为16×16,(步幅2)转置卷积把输入的宽和高都分别放大了2倍
  77. nn.ConvTranspose2d(ngf * 4, ngf * 2, 4, 2, 1, bias=False),
  78. nn.BatchNorm2d(ngf * 2),
  79. nn.ReLU(True),
  80. #输入通道数64*2=128,过滤器大小128x16x16,输出通道数64
  81. #上采样为32×32,(步幅2)转置卷积把输入的宽和高都分别放大了2倍
  82. nn.ConvTranspose2d(ngf * 2, ngf, 4, 2, 1, bias=False),
  83. nn.BatchNorm2d(ngf),
  84. nn.ReLU(True),
  85. #输入通道数64,过滤器大小64x32x32,输出通道数3
  86. #上采样为64×64,(步幅2)转置卷积把输入的宽和高都分别放大了2倍
  87. nn.ConvTranspose2d(ngf,nc, 4, 2, 1, bias=False),
  88. nn.Tanh()
  89. #最终输出的过滤器大小3x64x64
  90. )
  91. def forward(self, input):
  92. output = self.main(input)
  93. return output
  94. netG = _netG()
  95. netG.apply(weights_init)
  96. print(netG)
  97. #_netG(
  98. # (main): Sequential(
  99. # (0): ConvTranspose2d (100, 512, kernel_size=(4, 4), stride=(1, 1), bias=False)
  100. # (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True)
  101. # (2): ReLU(inplace)
  102. # (3): ConvTranspose2d (512, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
  103. # (4): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True)
  104. # (5): ReLU(inplace)
  105. # (6): ConvTranspose2d (256, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
  106. # (7): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True)
  107. # (8): ReLU(inplace)
  108. # (9): ConvTranspose2d (128, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
  109. # (10): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True)
  110. # (11): ReLU(inplace)
  111. # (12): ConvTranspose2d (64, 3, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
  112. # (13): Tanh()
  113. # )
  114. #)
  115. #定义判别网络
  116. class _netD(nn.Module):
  117. def __init__(self):
  118. super(_netD, self).__init__()
  119. self.main = nn.Sequential(
  120. #输入通道数3,输出通道数64
  121. nn.Conv2d(nc, ndf, 4, 2, 1, bias=False),
  122. nn.LeakyReLU(0.2, inplace=True),
  123. #输入通道数64,过滤器大小64x32x32,输出通道数64*2=128
  124. #下采样为32×32,(步幅2)步进卷积把输入的宽和高都分别缩小了2倍
  125. nn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False),
  126. nn.BatchNorm2d(ndf * 2),
  127. nn.LeakyReLU(0.2, inplace=True),
  128. #输入通道数128,过滤器大小128x16x16,输出通道数256
  129. #下采样为16x16,(步幅2)步进卷积把输入的宽和高都分别缩小了2倍
  130. nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, bias=False),
  131. nn.BatchNorm2d(ndf * 4),
  132. nn.LeakyReLU(0.2, inplace=True),
  133. #输入通道数256,过滤器大小256x8x8,输出通道数512
  134. #下采样为8x8,(步幅2)步进卷积把输入的宽和高都分别缩小了2倍
  135. nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, bias=False),
  136. nn.BatchNorm2d(ndf * 8),
  137. nn.LeakyReLU(0.2, inplace=True),
  138. #输入通道数512,过滤器大小256x4x4,输出通道数1
  139. #下采样为4x4,(步幅2)步进卷积把输入的宽和高都分别缩小了2倍
  140. nn.Conv2d(ndf * 8, 1, 4, 1, 0, bias=False),
  141. nn.Sigmoid()
  142. )
  143. def forward(self, input):
  144. output = self.main(input)
  145. return output.view(-1, 1).squeeze(1)
  146. netD = _netD()
  147. netD.apply(weights_init)
  148. print(netD)
  149. #_netD(
  150. # (main): Sequential(
  151. # (0): Conv2d (3, 64, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
  152. # (1): LeakyReLU(0.2, inplace)
  153. # (2): Conv2d (64, 128, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
  154. # (3): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True)
  155. # (4): LeakyReLU(0.2, inplace)
  156. # (5): Conv2d (128, 256, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
  157. # (6): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True)
  158. # (7): LeakyReLU(0.2, inplace)
  159. # (8): Conv2d (256, 512, kernel_size=(4, 4), stride=(2, 2), padding=(1, 1), bias=False)
  160. # (9): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True)
  161. # (10): LeakyReLU(0.2, inplace)
  162. # (11): Conv2d (512, 1, kernel_size=(4, 4), stride=(1, 1), bias=False)
  163. # (12): Sigmoid()
  164. # )
  165. #)
  166. #1.torch.normal(means, std, out=None)
  167. # 返回一个张量,包含从给定参数means和std的离散正态分布中抽取随机数。
  168. # 均值means是一个张量,包含每个输出元素相关的正态分布的均值。
  169. # std是一个张量,包含每个输出元素相关的正态分布的标准差。
  170. # 均值和标准差的形状不须匹配,但每个张量的元素个数须相同。
  171. # 参数:
  172. # means(Tensor) – 均值
  173. # std(Tensor) – 标准差
  174. # out(Tensor) – 可选的输出张量
  175. # 例子:torch.FloatTensor(xx, xx, xx, xx).normal_(0, 1)
  176. #
  177. #2.torch.normal(mean=0.0, std, out=None)
  178. # 与上面函数类似,所有抽取的样本共享均值。
  179. # 参数:
  180. # means (Tensor,optional) – 所有分布均值
  181. # std (Tensor) – 每个元素的标准差
  182. # out (Tensor) – 可选的输出张量
  183. #
  184. #3.torch.normal(means, std=1.0, out=None)
  185. # 与上面函数类似,所有抽取的样本共享标准差。
  186. # 参数:
  187. # means (Tensor) – 每个元素的均值
  188. # std (float, optional) – 所有分布的标准差
  189. # out (Tensor) – 可选的输出张量
  190. #定义损失函数
  191. criterion = nn.BCELoss()
  192. #判别器模型输入(64,3,64,64)
  193. input = torch.FloatTensor(batch_size, 3, img_size, img_size)
  194. #生成器模型输入(64,100,1,1),随机噪声
  195. noise = torch.FloatTensor(batch_size, nz, 1, 1)
  196. #生成器模型输入(64,100,1,1),均值为0标准差为1的随机噪声
  197. fixed_noise = torch.FloatTensor(batch_size, nz, 1, 1).normal_(0, 1)
  198. label = torch.FloatTensor(batch_size)
  199. #真实图像标签
  200. real_label = 1
  201. #合成图像标签
  202. fake_label = 0
  203. if torch.cuda.is_available():
  204. netD.cuda()
  205. netG.cuda()
  206. criterion.cuda()
  207. input, label = input.cuda(), label.cuda()
  208. noise, fixed_noise = noise.cuda(), fixed_noise.cuda()
  209. fixed_noise = Variable(fixed_noise)
  210. #定义判别器优化器
  211. optimizerD = optim.Adam(netD.parameters(), lr, betas=(beta1, 0.999))
  212. #定义生成器优化器
  213. optimizerG = optim.Adam(netG.parameters(), lr, betas=(beta1, 0.999))
  214. #1.除了训练生成新图片外,还有一个可用于分类问题的判别网络。判别网络学习图片的重要特征,
  215. # 在只有有限数量的标签数据可用时,这些特征可用于分类任务。当标签数据有限时,可以训练 GAN,
  216. # 为我们提供一个用于提取特征的分类器,分类器模型可以基于此构建。
  217. #
  218. #2.训练判别器网络
  219. # 1.训练判别网络的损失函数定义为 loss = 最大化maximize log(D(x)) + log(1-D(G(z)))
  220. # 1.判别网络的损失取决于它在真实图片上的表现和它在生成网络生成的伪造图片上的表现。
  221. # 因此,需要使用真实图片和生成网络生成的伪造图片进行训练。
  222. # 2.log(D(x)):使用真实图片和真实图片标签进行来训练判别网络,得出判别网络在真实图片上的表现。
  223. # 3.log(1-D(G(z))):使用生成器网络生成的伪造图片和伪造图片标签来训练判别网络,得出判别网络在伪造图片上的表现。
  224. # 2.训练生成器网络的损失函数定义为 loss = 最大化maximize log(D(G(z)))
  225. # log(D(G(z))):使用生成器网络生成的伪造图片和伪造的“真实图片标签”来训练判别网络,并且根据判别网络的反馈来训练生成器网络,
  226. # 其更新方向是使得判别器能够将合成图像预测为“真实图像”,这个过程是训练生成器去欺骗判别器。
  227. for epoch in range(niter):
  228. for i, data in enumerate(dataloader, 0):
  229. ############################
  230. #更新判别器网络的损失: 最大化maximize log(D(x)) + log(1 - D(G(z)))
  231. # 先是使用真实图片和真实图像标签训练判别器网络,然后使用合成图像和合成图像标签训练判别器网络
  232. # 第一步:使用真实图片训练判别网络
  233. # 第二步:使用伪造图片训练判别网络
  234. # 第三步:单独优化判别器网络
  235. ###########################
  236. #新一轮的训练判别器网络之前,先把梯度值置为0
  237. netD.zero_grad()
  238. #获取遍历的真实图片
  239. real_cpu, _ = data
  240. batch_size = real_cpu.size(0)
  241. if torch.cuda.is_available():
  242. real_cpu = real_cpu.cuda()
  243. #真实图片放入到判别器模型输入变量中
  244. input.resize_as_(real_cpu).copy_(real_cpu)
  245. #真实图像标签,其值为1
  246. label.resize_(batch_size).fill_(real_label)
  247. inputv = Variable(input)
  248. labelv = Variable(label)
  249. #使用真实图片和真实图像标签训练判别器网络
  250. output = netD(inputv)
  251. errD_real = criterion(output, labelv)
  252. #计算真实图像和真实图像标签所训练的判别器网络的损失和梯度
  253. errD_real.backward()
  254. D_x = output.data.mean()
  255. #使用伪造图片训练
  256. #生成器模型输入(64,100,1,1),使用均值为0标准差为1的随机噪声
  257. noise.resize_(batch_size, nz, 1, 1).normal_(0, 1)
  258. noisev = Variable(noise)
  259. #通过生成器网络把随机噪声生成为合成图片,然后使用合成图片和合成图像标签值为0 进行训练判别器网络
  260. fake = netG(noisev)
  261. #合成图像标签值为0
  262. labelv = Variable(label.fill_(fake_label))
  263. #在判别器网络在训练的时候,不想让生成网络同时也发生训练,因而,通过在判别模型输入上调用detach()方法,
  264. #把输出的合成图片从生成器网络中脱离出来,即只得到生成器模型输出的合成图片,
  265. #而不会把生成器这一层网络也包含进来到判别器模型的输入中,那么优化的时候便只能优化到判别器网络,而不会优化到生成器网络。
  266. output = netD(fake.detach())
  267. #使用合成图片和合成图像标签值为0 进行训练判别器网络
  268. errD_fake = criterion(output, labelv)
  269. #计算合成图像和合成图像标签所训练的判别器网络的损失和梯度
  270. errD_fake.backward()
  271. D_G_z1 = output.data.mean()
  272. errD = errD_real + errD_fake
  273. #当真实图像和合成图像所训练的判别网络的损失和梯度都均已经计算完成后,然后调用optimizer真正开始训练判别器网络,
  274. #那么判别器网络便能识别图片的真伪了。optimizerD.step():用于真正改变调整判别器网络的学习参数,
  275. #而此处仅单独优化判别器网络,而不优化生成器网络,因此判别器的权重会进行更新,而生成器的权重则不会进行更新。
  276. optimizerD.step()
  277. ############################
  278. #更新生成器网络的损失: 最大化maximize log(D(G(z)))
  279. # 第一步:基于判别器网络的反馈来训练生成器网络
  280. # 第二步:单独优化生成器网络
  281. ###########################
  282. #新一轮的训练生成器网络之前,先把梯度值置为0
  283. netG.zero_grad()
  284. #定义真实图像标签其值为1,但是此处定义的真实图像标签实际是伪造的
  285. #目的是使用基于合成图像和伪造的“真实图像标签”来进行计算损失和梯度的判别器网络的反馈来训练生成器网络,
  286. #生成器从未直接见过训练集中的图像,它所知道的关于数据的信息都来自于判别器的反馈。
  287. labelv = Variable(label.fill_(real_label))
  288. #把前面的生成器网络所生成的相同合成图片作为此处判别器网络的模型输入数据,但这一次不执行fake.detach(),
  289. #即不再把输出的合成图片从生成器网络中脱离出来,也即输出的合成图片和所包含的生成器网络都一起作为判别器网络的模型输入,
  290. #因为我们希望生成器网络能得到训练和优化。
  291. output = netD(fake)
  292. errG = criterion(output, labelv)
  293. #计算合成图像和伪造的“真实图像标签”基于判别器网络的损失和梯度,目的是使用基于判别器网络的反馈来训练生成器网络
  294. errG.backward()
  295. D_G_z2 = output.data.mean()
  296. #当计算好判别器网络的损失和梯度之后,由于此处只想让生成网络得到训练和优化,对判别器网络不想进行训练和优化,
  297. #而且目的是使用基于判别器网络的反馈来训练生成器网络,因此最终仅需要调用生成器网络的优化器,
  298. #仅单独优化生成器网络,而不优化判别器网络,用于真正改变调整生成器网络的学习参数,
  299. #因此生成器的权重会进行更新,而判别器的权重则不会进行更新。
  300. #如果此时对判别器的权重也同时进行更新的话,则会导致训练判别器始终预测为“真”,但这并不是想要的效果。
  301. #使用这些随机向量所生成的合成图像和伪造的“真实图像”的标签来最终训练判别器,
  302. #其更新方向是使得判别器能够将合成图像预测为“真实图像”,这个过程是训练生成器去欺骗判别器。
  303. #在生成网络生成略微真实的图片之前,把整个过程重复迭代好几次。
  304. optimizerG.step()
  305. print('[%d/%d][%d/%d] Loss_D: %.4f Loss_G: %.4f D(x): %.4f D(G(z)): %.4f / %.4f'
  306. % (epoch, niter, i, len(dataloader), errD.data[0], errG.data[0], D_x, D_G_z1, D_G_z2))
  307. if i % 100 == 0:
  308. #vutils.save_image 将接受一个张量并保存为图片。如果提供的是小批量的图片,就保存为图片网格。
  309. vutils.save_image(real_cpu, '%s/real_samples.png' % outf, normalize=True)
  310. #生成网络根据均值为0标准差为1的随机噪声生成合成图像,要求此处的生成网络生成略微真实的图片之前,都要把整个过程重复迭代好几次。
  311. fake = netG(fixed_noise)
  312. vutils.save_image(fake.data, '%s/fake_samples_epoch_%03d.png' % (outf, epoch), normalize=True)

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 13

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 14

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 15

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 16

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 17

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 18


密集连接网络、卷积网络、深度可分离卷积、循环网络

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 19

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 20

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 21

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 22

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 23

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 24


前馈网络

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 25

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9henVzYS5ibG9nLmNzZG4ubmV0_size_16_color_FFFFFF_t_70 26

发表评论

表情:
评论列表 (有 0 条评论,148人围观)

还没有评论,来说两句吧...

相关阅读