1.前言

GAN项目被我搁置一旁很久了,最近想回顾一下写过的程序,看看能不能发现一些错误或是从中得到一些新的灵感和启发。

2.程序回顾

废话不多说,直接上代码,我只挑一些比较重要的进行分析。
TensorFlow-gpu版本:1.12.0

(1)sys.path

Python在看一个模块是否存在时首先会看看自身内核中的模块,如果不存在,则就要到sys.path中去找,print(sys.path)输出的是所有路径,如果你是自定义的模块,就要通过sys.path.append加入模块所在的目录即可,否则import的时候会报错。

(2)tf.set_random_seed(seed)

如果在一个tf.Graph中加入tf.set_random_seed(seed)会让使用tf的变量(tf.constanttf.Variable()的初始化每次运行的时候都是相同的值),举个例子吧:

import tensorflow as tf
graph1 = tf.Graph()  # 创建一个新的计算图
with graph1.as_default():tf.set_random_seed(10)  # 这个随机种子将决定整个graph1下的所有变量的取值a = tf.random_normal([5])with tf.Session() as sess1:print(sess1.run(a))print(sess1.run(a))with tf.Session() as sess2:print(sess2.run(a))print(sess2.run(a))

结论:在同一个graph1下的不同会话的输出值是相同的。

注意:如果存在with, tf.set_random_seed(10)(计算图级)必须放放在with中,否则将没有作用,因为不是全局设置的语句!或者在变量中去定义seed:a = tf.random_normal([5], seed=1)也就是设置操作级的随机数。

下面,我再举例说明.as_default()的用法:

import tensorflow as tf
a = tf.constant(1.0)  # 常数
print(a.graph)
graph1 = tf.Graph()  # 创建一个新的计算图
print(a.graph is tf.get_default_graph())  # 输出True,说明创建a的时候就已经创建了一个graph了
print(a.graph is graph1)  # 输出Falsewith graph1.as_default() as graph:  # 一共有两个图了,指定graph1为默认的图print(a.graph is graph1)  # 输出False,因为图不一样b = tf.Variable(tf.constant(2.0))  # 变量print(b.graph is graph1)  # 输出True,因为图一样init = tf.global_variables_initializer()  # 因为有Variablewith tf.Session().as_default() as sess:  # .as_default()保证了当前会话在with结束后不关闭sess.run(init)  # 必须单独写print(sess.run([b]))  # run是有顺序的# sess.close()  # 加上这句,即使有.as_default(),后面也会报错的print(b.eval(session=sess))  # 必须要指定sess

结论:
① Variable的init必须是单独的
② run可以多个变量一起,必须用[]或者()
③ eval一次只能对一个变量进行输出
④ 在一个session下要run两个变量,如果两个变量是在不同的graph中,则会报错
例如:print(sess.run([b,a]))
⑤ 当一个变量被创建的时候,就会生成一个默认的图,一个线程中可以画很多图,但是默认的图只有一个

(3)tf.variable_scope(name)tf.name_scope(name)

tf.variable_scope(name)域下的变量可以使用tf.get_variable()来定义,也可以用tf.Variable()来定义;而tf.name_scope(name)仅能用tf.Variable()来定义,具体操作见下:

>>> with tf.variable_scope('vars'):
...     var1 = tf.get_variable(name='var1', shape=[1, 2])
...
>>> var1.name
'vars/var1:0'
# 下面如果要再在vars域下面声明一个名叫var1的变量是会报错误的,如果是要做变量共享,则可以继续这样做:
>>> with tf.variable_scope('vars', reuse=True):
...     var2 = tf.get_variable(name='var1', shape=[1, 2])
...
>>> var2.name
'vars/var1:0'
# 从上面可以看出,变量的生成只与name有关,需要注意的是当变量name相同时,你的shape也要一致;name_scope是不能使用reuse的,但是允许在同一个域下使用相同name的变量,因为会自动为这些变量增加序号哦:
>>> with tf.name_scope('vars'):
...     var1 = tf.Variable(1, name='var1')
...
>>> var1.name
'vars_5/var1:0'
>>> with tf.name_scope('vars'):
...     var2 = tf.Variable(1, name='var1')
...
>>> var2.name
'vars_6/var1:0'

(4)tf.contrib.layers.batch_norm()tf.nn.dropout()

批归一化在算法层面有两点需要注意:
① 训练阶段只有两个可训练的参数,β和γ,用于缩放,然后就是两个不可训练的参数,滑动平均值和方差
② 测试阶段,一般使用保存好的滑动平均值和方差即可

在实际使用批归一化的时候,却没那么简单,对于不同的深度学习框架,配置方式和难易程度差别很大,这里就只介绍TensorFlow下的实现方式:

第一步:搭建批归一化层,其中最重要的就是is_training参数,True为训练过程,False为测试过程,当然,你可以将这个层封装为一个可以直接调用的函数,也就是放在def __call__(self, x):

tf.contrib.layers.batch_norm(x, decay=self.momentum, updates_collections=None, is_training=self.trainable, epsilon=self.epsilon, scale=True, scope=self.name)

第二步,在优化器层上封装如下语句,这个是tf.contrib.layers.batch_norm硬性规定的,目的就是前面提到的批归一化参数变量

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):d_optim = tf.train.AdamOptimizer().minimize(loss, var_list=var)

对于dropout,这个与批归一化类似,在训练阶段需要设置keep_prob为0.5或者其他的<1.0的数,在测试阶段一般是不使用dropout的,因为这个是随机的过程,你不能也无法取模拟训练的过程,所以设置为1.0

需要注意的一点:在TensorFlow中只能自己通过sess.run()去设置keep_prob和is_training

================= To be continued =================

TensorFlow GAN项目程序回顾2020.12.03相关推荐

  1. Leetcode 2020/12/03打卡 204计算质数(简单)

    204. 计数质数 == 万一我侵犯了您的权利,联系我,我必删 统计所有小于非负整数 n 的质数的数量. 示例 1: 输入:n = 10 输出:4 解释:小于 10 的质数一共有 4 个, 它们是 2 ...

  2. 【2020.12.03提高组模拟】袋鼠

    题目 题目描述 你知道吗?乌拉圭的人口有345.7万,同时,仅澳大利亚就有4700万只袋鼠. 袋鼠决定入侵乌拉圭.袋鼠们将在平原上布阵,平原被划分成 n×mn \times mn×m 的网格. 每个格 ...

  3. 2020.12.03丨全长转录组之基因和转录本鉴定

    折叠转录本 分析目的:基于基因组比对结果,将相似的多转录本折叠成单个转录本(去冗余) PacBio分析软件: TAMA:https://github.com/GenomeRIK/tama TAMA简介 ...

  4. 欧姆龙PLC项目程序NJ系列模切机程序 12轴EtherCAT总线伺服运动控制,包含回零、点动、定位、速度控制

    欧姆龙PLC项目程序NJ系列模切机程序 1.12轴EtherCAT总线伺服运动控制,包含回零.点动.定位.速度控制. 2.张力控制PID算法,收放卷径计算, 3.隔膜自动纠偏控制,模拟量数据平均化处理 ...

  5. 欧姆龙PLC项目程序NJ系列模切机程序 12轴EtherCAT总线伺服运动控制,包含回零、点动、定位

    欧姆龙PLC项目程序NJ系列模切机程序 1.12轴EtherCAT总线伺服运动控制,包含回零.点动.定位.速度控制. 2.张力控制PID算法,收放卷径计算, 3.隔膜自动纠偏控制,模拟量数据平均化处理 ...

  6. 全面回顾2020年图机器学习进展,12位大神论道、寄望2021年大爆发

    2021-01-10 18:22:01 作者 |Michael Bronstein 编译 | Mr.Bear 编辑 | 陈大鑫 图机器学习在 2020 年大放异彩,各种新理论和新应用精彩纷呈. 就在近 ...

  7. Web Wiz Forums 12.03 ASP论坛程序源码

    Web Wiz Forums是一套相当不错的免费ASP论坛程序,作者来自于英国,无论您想架设10个人或者大到100000人的强大技术支持论坛,这个快速.可设置管理权限等级的论坛程序,都足以满足您的需求 ...

  8. Jeaf Dean万字长文回顾2020谷歌技术发展(上)

    转载自:新智元 编辑:QJP,小匀   [导读]2021年已经度过十余天,谷歌Jeff Dean也在酝酿后在Google Blog发表了一篇万字长文,回顾了谷歌AI2020年的发展与成就,同时,也展望 ...

  9. 1+X Web前端等级考证 | 2020 12月Web前端开发中级实操 (模拟试题第一套) 附答案

    由于经常分享失败,我上传github上了,先放上链接:https://github.com/Lydever/web-1-x.git 请礼貌,不要耍流氓哈哈,创作不易,下载的同时,请start一下,谢谢 ...

最新文章

  1. javascript获取和设置URL中的参数
  2. Windows 性能问题诊断(5)
  3. python编码注释和平台注释_python注释是什么意思
  4. php中接口验证失败,php短信验证失败的原因
  5. CCF 2014-3-1 相反数
  6. [转]UART 基础知识
  7. insert时调用本身字段_java中子类调用父类构造方法注意事项
  8. vim怎么把一个写的代码文件另存到任意文件夹里?
  9. C++ Iostreams 用法详解(二)标准输入输出
  10. Ruby Tip:定义索引操作符
  11. TOP Network技术总监Justin:TOP公链已率先实现多层状态分片
  12. FPGA实现贪吃蛇小游戏
  13. 使用IDLE进行编程
  14. 推荐几个可以免费使用的ChatGPT工具
  15. 苹果x看html文字有黑线,iPhonex屏幕旁边出现绿线怎么回事 iPhonex屏幕旁边绿线是什么问题...
  16. 二代身份证文字照片位置定位mask
  17. (新SOTA)UNETR++:轻量级的、高效、准确的共享权重的3D医学图像分割
  18. 可靠性测试主要注意点
  19. 论文阅读:Softer-NMS: Rethinking Bounding Box Regression for Accurate Object Detection
  20. springboot_vue校园二手交易平台java毕业设计

热门文章

  1. python查看继承方法(一分钟读懂)
  2. ctf题目:看不见的flag_记一次江西省信息安全线下CTF比赛
  3. 剑指 Offer 55 - I. 二叉树的深度
  4. 数据结构实验 4.括号画家
  5. ROS2——Windows上的安装笔记
  6. 【干货】微信小程序如何让view标签中内容居中
  7. 树莓派教程 - 1.2 树莓派GPIO库wiringPi 软件PWM
  8. 部署模型之Libtorch学习(一)
  9. merge合并两个有序数组
  10. IntellijIDEA配置Maven