前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TensorFlow应用实战 | 编写训练的python文件

TensorFlow应用实战 | 编写训练的python文件

作者头像
用户1332428
发布2018-07-30 15:27:41
5980
发布2018-07-30 15:27:41
举报
文章被收录于专栏:人工智能LeadAI人工智能LeadAI

正文共600个字,1张图,预计阅读时间5分钟。

编写训练的python文件

代码语言:javascript
复制
 1# -*- coding: UTF-8 -*-
 2"""
 3训练 DCGAN
 4"""
 5import os
 6import glob
 7import numpy as np
 8from scipy import misc
 9import keras as tf.keras
10from network import *
11def train():
12if __name__ == "__main__":
13train()

获取训练数据

代码语言:javascript
复制
1# 获取训练数据
2data = []
3for image in glob.glob("images/*"):
4# 读取图片,返回一个数组对象
5image_data = misc.imread(image)  # imread 利用 PIL 来读取图片数据
6data.append(image_data)
7input_data = np.array(data)

将数据进行标准化

代码语言:javascript
复制
1# 将数据标准化成 [-1, 1] 的取值, 这也是 Tanh 激活函数的输出范围
2input_data = (input_data.astype(np.float32) - 127.5) / 127.5

tanh的取值范围是-1 到 1

像素值最大255 减去一半127.5 再除以 127.5 被限制到-1到1之间。

构造生成器和判别器

代码语言:javascript
复制
1# 构造 生成器 和 判别器
2g = generator_model()
3d = discriminator_model()

构建生成器和判别器组成的网络模型

代码语言:javascript
复制
1# 构建 生成器 和 判别器 组成的网络模型
2d_on_g = generator_containing_discriminator(g, d)

里面的参数传入g和d

优化器使用Adam optimizers

代码语言:javascript
复制
1# 优化器用 Adam Optimizer
2g_optimizer = tf.keras.optimizers.Adam(lr=LEARNING_RATE, beta_1=BETA_1)
3d_optimizer = tf.keras.optimizers.Adam(lr=LEARNING_RATE, beta_1=BETA_1)

学习率是我们之前定义的学习率。beta_1 参数。

使用compile方法对于神经网络进行配置 生成器 和 判别器

代码语言:javascript
复制
1# 配置 生成器 和 判别器
2g.compile(loss="binary_crossentropy", optimizer=g_optimizer)
3d_on_g.compile(loss="binary_crossentropy", optimizer=g_optimizer)
4d.trainable = True
5d.compile(loss="binary_crossentropy", optimizer=d_optimizer)

交叉熵损失函数。固定住判别器去优化生成器。相反固定一方优化另一方。

开始训练

代码语言:javascript
复制
 1# 开始训练
 2for epoch in range(EPOCHS):
 3# 每经过一个batchsize大小训练一下
 4for index in range(int(input_data.shape[0] / BATCH_SIZE)):
 5    # 数据切片
 6    input_batch = input_data[index * BATCH_SIZE : (index + 1) * BATCH_SIZE]
 7
 8    # 连续型均匀分布的随机数据(噪声)
 9    random_data = np.random.uniform(-1, 1, size=(BATCH_SIZE, 100))
10    # 生成器 生成的图片数据
11    generated_images = g.predict(random_data, verbose=0)
12    # 首尾相连,输入自身以及产生的图片
13    input_batch = np.concatenate((input_batch, generated_images))
14    # 输出的数据要么是0 要么是 1。1就是通过检测,跟真实图片一致。
15    output_batch = [1] * BATCH_SIZE + [0] * BATCH_SIZE
16
17    # 训练 判别器,让它具备识别不合格生成图片的能力
18    d_loss = d.train_on_batch(input_batch, output_batch)
19
20    # 当训练 生成器 时,让 判别器 不可被训练
21    d.trainable = False
22
23    # 重新生成随机数据。很关键
24    random_data = np.random.uniform(-1, 1, size=(BATCH_SIZE, 100))
25
26    # 训练 生成器,并通过不可被训练的 判别器 去判别
27    g_loss = d_on_g.train_on_batch(random_data, [1] * BATCH_SIZE)
28
29    # 恢复 判别器 可被训练
30    d.trainable = True
31
32    # 打印损失
33    print("Epoch {}, 第 {} 步, 生成器的损失: {:.3f}, 判别器的损失: {:.3f}".format(epoch, index, g_loss, d_loss))

保存生成器和判别器的参数

代码语言:javascript
复制
1# 保存 生成器 和 判别器 的参数
2# 大家也可以设置保存时名称不同(比如后接 epoch 的数字),参数文件就不会被覆盖了
3if epoch % 10 == 9:
4    g.save_weights("generator_weight", True)
5    d.save_weights("discriminator_weight", True)

当我们训练完成,会生成一个generator_weight文件.

它是一个h5py的文件。

代码语言:javascript
复制
1pip install h5py

编写神经网络生成图片的方法

代码语言:javascript
复制
 1 # -*- coding: UTF-8 -*-
 2 """
 3 用 DCGAN 的生成器模型 和 训练得到的生成器参数文件 来生成图片
 4 """
 5 import numpy as np
 6 from PIL import Image
 7 import keras as tf.keras
 8 from network import *
 9 def generate():
10 # 构造生成器
11 g = generator_model()
12# 配置 生成器
13g.compile(loss="binary_crossentropy", optimizer=tf.keras.optimizers.Adam(lr=LEARNING_RATE, beta_1=BETA_1))
14# 加载训练好的 生成器 参数
15g.load_weights("generator_weight")
16
17# 连续型均匀分布的随机数据(噪声)
18random_data = np.random.uniform(-1, 1, size=(BATCH_SIZE, 100))
19# 用随机数据作为输入,生成器 生成图片数据
20images = g.predict(random_data, verbose=1)
21
22# 用生成的图片数据生成 PNG 图片
23for i in range(BATCH_SIZE):
24# 将被限制到-1到1之间的数据进行还原
25image = images[i] * 127.5 + 127.5
26Image.fromarray(image.astype(np.uint8)).save("image-%s.png" % i)
27 if __name__ == "__main__":
28generate()

代码完成与测试模型

一个错误的个人使用,因为我的TensorFlow版本较老。keras并没有被集成进来。

我以为可以

代码语言:javascript
复制
1import keras as tf.keras

但是测试失败了,直接把全部的tf.keras全部替换为keras。

新的风暴

代码语言:javascript
复制
1throws OOM when allocating tensor with shape

又是穷人才会遇到的问题。

将batch_size大小从128改为64可以正常训练。

然后使用generator.py生成图片。

代码语言:javascript
复制
1# 配置 生成器 和 判别器
2g.compile(loss="binary_crossentropy", optimizer=g_optimizer)
3d_on_g.compile(loss="binary_crossentropy", optimizer=g_optimizer)
4d.trainable = True
5d.compile(loss="binary_crossentropy", optimizer=d_optimizer)

让判别器先可以训练,再设置。我们训练生成器的随机数据不应该和训练整个dong的一样,不然不够随机化。

基本都得训练好几个小时。

原文链接:https://www.jianshu.com/p/fdac1cdae92d

查阅更为简洁方便的分类文章以及最新的课程、产品信息,请移步至全新呈现的“LeadAI学院官网”: www.leadai.org

请关注人工智能LeadAI公众号,查看更多专业文章

大家都在看

LSTM模型在问答系统中的应用

基于TensorFlow的神经网络解决用户流失概览问题

最全常见算法工程师面试题目整理(一)

最全常见算法工程师面试题目整理(二)

TensorFlow从1到2 | 第三章 深度学习革命的开端:卷积神经网络

装饰器 | Python高级编程

今天不如来复习下Python基础

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人工智能LeadAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编写训练的python文件
  • 编写神经网络生成图片的方法
  • 代码完成与测试模型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档