DCGAN_tf2
跟着tf官网过一遍DCGAN的算法流程,源地址
导入包
|
|
- absolute_import模块:一般情况下,程序默认是先在系统的默认目录中寻找导入的包,但是如果我们不想要导入当前目录中的包,就可以用__future__ import absolute_import,这样就可以标准的包
- division:在python2和python3中的/除号不同,3中/默认是精确除,//才是地板除。如果要在python2中使用3中的除法,就可以通过__future__导入division实现
- print_function模块:使所有的print方法都需要加括号,而不是想python2中的那样可以直接写入
- **unicode_literal:**在Python中有些库的接口要求参数必须是str类型字符串,有些接口要求参数必须是unicode类型字符串。对于str类型的字符串,调用len()和遍历时,其实都是以字节为单位的,这个太就比较坑了,同一个字符使用不同的编码格式,长度往往是不同的。对unicode类型的字符串调用len()和遍历才是以字符为单位,这是我们所想要的。另外,Django,Django REST framework的接口都是返回unicode类型的字符串。为了统一,我个人建议使用from future import unicode_literals,将模块中显式出现的所有字符串转为unicode类型
- 参考知乎点滴学习
|
|
|
|
image.io是读取图片的库
1 2 3 4 5>>> import imageio >>> im = imageio.imread('imageio:astronaut.png') >>> im.shape # im is a numpy array (512, 512, 3) >>> imageio.imwrite('astronaut-gray.jpg', im[:, :, 0])
|
|
-
glob :
glob.glob(pathname, ***, recursive(递归)=False) 返回pathname下符合过滤条件的文件的文件名list-
1 2glob.glob('**/*.txt', recursive=True) ['2.txt', 'sub/3.txt']
-
-
image: 上面说了,读取图片用的
-
matplotlib.pyplot: 包含一系列类似 MATLAB 中绘图函数的相关函数
-
numpy: 数学方法库
-
os
-
**PIL:**图像处理标准库(例子,模糊图片)
-
from PIL import Image, ImageFilter # 打开一个jpg图像文件,注意是当前路径: im = Image.open('test.jpg') # 应用模糊滤镜: im2 = im.filter(ImageFilter.BLUR) im2.save('blur.jpg', 'jpeg')
-
-
**tensorflow.keras:**tf2推荐使用的网络搭建框架
-
time
-
IPython.display
- Ipython是python的交互式shell,比默认的pythonshell 好用。
- display显示文件喽
加载数据集
|
|
-
tf.keras.datasets.mnist.load_data: 下载数据并分割,返回值
(x_train, y_train), (x_test, y_test) -
train_images.reshape(): 给定张量后,此操作将返回一个新的tf.Tensor,该张量具有与张量相同的值,并且顺序相同,不同之处在于用shape赋予了新的形状
-
tf.reshape( tensor, shape, name=None )
-
创建模型:生成器
|
|
-
tf.keras.layers.LeakyReLU: 泄漏的整流线性单元,当神经元未激活时,它仍允许赋予一个很小的梯度:
f(x) = alpha * x for x < 0,f(x) = x for x >= 0.-
1 2 3tf.keras.layers.LeakyReLU( alpha=0.3, **kwargs ):grey_question: 不是很懂。。。
-
-
layers.Conv2DTranspose: 转置卷积层,
测试:用生成器生成一张图片
1 2 3 4 5 6generator = make_generator_model() noise = tf.random.normal([1, 100]) generated_image = generator(noise, training=False) plt.imshow(generated_image[0, :, :, 0], cmap='gray')- 把噪声输入生成器就可以了。
创建模型:判别器
|
|
-
判别器是一个基于CNN的图片分类器
-
layers.Dropout(0.3): keras.layers.Dropout(rate, noise_shape=None, seed=None)
- 为了防止过拟合,在每次训练中随机丢弃一些数据。rate:丢弃的比例
测试:用判别器对图片的真伪进行判断。
1 2 3discriminator = make_discriminator_model() decision = discriminator(generated_image) print (decision)
定义损失函数和优化器
|
|
-
**判别器损失:**该方法量化判别器从判断真伪图片的能力。它将判别器对真实图片的预测值与值全为 1 的数组进行对比,将判别器对伪造(生成的)图片的预测值与值全为 0 的数组进行对比。
-
**生成器损失:**生成器损失量化其欺骗判别器的能力。直观来讲,如果生成器表现良好,判别器将会把伪造图片判断为真实图片(或 1)。这里我们将把判别器在生成图片上的判断结果与一个值全为 1 的数组进行对比。
-
tf.ones_like():实例化与另一个张量相同形状的全一变量。
-
keras.backend.ones_like(x, dtype=None, name=None)
-
x:张量或者变量
-
dtype:字符串,返回keras变量的类型。如果为 None,则使用 x 的类型。
-
1 2 3 4 5 6>>> from keras import backend as K >>> kvar = K.variable(np.random.random((2,3))) >>> kvar_ones = K.ones_like(kvar) >>> K.eval(kvar_ones) array([[ 1., 1., 1.], [ 1., 1., 1.]], dtype=float32)
-
-
tf.zeros_like():实例化与另一个张量相同尺寸的全零变量。参数和上面相同只不过形状相同,用0填充
|
|
保存检查点:
|
|
对任务中断再恢复有帮助。
定义训练循环
训练循环在生成器接收到一个随机种子作为输入时开始。该种子用于生产一张图片。判别器随后被用于区分真实图片(选自训练集)和伪造图片(由生成器生成)。针对这里的每一个模型都计算损失函数,并且计算梯度用于更新生成器与判别器
|
|
生成保存图片:
|
|
正式训练:
|
|
其他
恢复最新的检查点:
|
|
创建gif:
|
|
使用训练过程中生成的图片通过imagesio生成gif
|
|