学习TensorFlow和PyTorch有几个月了,这里总结一下自己学tensorflow时用到的东西
1,对tf.app.run()的理解:
按照args里面的超参数来运行main函数,有两种情况:
如果你的代码中的入口函数不叫main(),而是一个其他名字的函数,如test(),则你应该这样写入口tf.app.run(test)
如果你的代码中的入口函数叫main(),则你就可以把入口写成tf.app.run()
if __name__ == '__main__':
tf.app.run()
2,tf.reset_default_graph函数
用于清除默认图形堆栈并重置全局默认图形.说白了,就是每轮要清楚无效的计算图。
注意:要放在 tf.Session() 前面
3,为什么要写 tf.Graph().as_default()
引自: 为什么要写 tf.Graph().as_default()
tf.Graph() 表示实例化了一个类,一个用于 tensorflow 计算和表示用的数据流图,通俗来讲就是:在代码中添加的操作(画中的结点)和数据(画中的线条)都是画在纸上的“画”,而图就是呈现这些画的纸,你可以利用很多线程生成很多张图,但是默认图就只有一张。
tf.Graph().as_default() 表示将这个类实例,也就是新生成的图作为整个 tensorflow 运行环境的默认图,如果只有一个主线程不写也没有关系,tensorflow 里面已经存好了一张默认图,可以使用tf.get_default_graph() 来调用(显示这张默认纸),当你有多个线程就可以创造多个tf.Graph(),就是你可以有一个画图本,有很多张图纸,这时候就会有一个默认图的概念了。
as_default()函数的作用在于,返回一个上下文管理器,使得当前图对象成为当前默认的图对象。
get_default_graph()函数是获取当前默认图对象的句柄(这里的句柄, 可以简单理解为某个事物的唯一标识,就像学生学号)。
4,会话Session的三个参数:
4.1 会话的由来:
Tensorflow的内核使用更加高效的C++作为后台,Tensorflow把前台(Python程序)与后台之间的链接叫“会话”。
4.2 参数
1,target(可选):指定链接的执行引擎。如果这个值不为空,多用于分布式环境中。
2,graph(可选):指定要在Session对象中参与计算的图。默认值:None。
当在同一个进程中永乐很多图时,需要为不用的图使用不同的Session,需要指点graph参数
3 config(可选):辅助配置Session对象所需参数,如限制CPU或GPU的使用数目、为数据流图设置优化参数以及设置日志选项等。
5,Session中的run方法:
run(fetches, feed_dict=None, options=None, run_metadata=None)
后两个参数暂时不用
fetches参数:
表示数据流图中能接收的任意数据流图元素,要么是各类Op,要么是各种Tensor对象。一般是Tensor
若输入为Op, run()返回None
若输入为Tensor对象,则run返回NumPy数组
feed_dict参数(可选):
功能:给数据流图提供运行时的数据。feed_dict 的数据结构就是Python中的字典,其元素就是"键值对"(Key-Value)。
“Key”就是各种Tensor对象的句柄
“Value”可以是字符串、列表、NumPy数组等
6,TensorFlow中的placeholder
占位符,placeholder(dtype, shape=None, name=None)
三个参数:不解释了
7,TensorFlow中的Variable对象
数据流图中的Tensor对象和Op对象都是不可变的(immutable),Variable就是一个常驻内存、不会被轻易回收的Tensor
实例:
import tensorflow as tf
my_state = tf.Variable(0, name="counter") # 初始化一个Op变量my_state,初始化值为0(仅仅构思,还未执行)
one = tf.constant(1) # 常量Op,赋值为1
new_value = tf.add(my_state, one) # my_state+1
update = tf.assign(my_state, new_value) # assign函数,将new_value的值赋给my_state
init_Op = tf.global_variables_initializer() # global_variables_initializer()会返回一个操作:初始化计算图中所有的TensorFlow中的Variable对象
# 需注意,此时代码执行到这里也仅仅是构思,还未实现
with tf.Session() as session:
session.run(init_Op) # 实施初始化操作,即将my_state初始化为0. 且Session会记录下Varibale的变化
print(session.run(my_state)) # 输出0
for _ in range(3): # _代表垃圾变量,即虽然有但是不需要的变量
session.run(update) # 循环三次
print(session.run(my_state)) # 依次输出1,2,3
8,TensorFlow中的名称作用域(name_scope)
name_scope的作用有点像C++中的“命名空间(namespace)”,或者Java中的“包(package)”
在不同空间中,可以起相同的变量名而不冲突。(如果神经网络很复杂,想变量名都得想很久,name_scope解决了这个问题)
以实例说明:
import tensorflow as tf
with tf.name_scope('hidden') as scope: # hidden意为隐含层
a = tf.constant(5, name='alpha')
print(a.name) # 输出:hidden/alpha:0
weights = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0), name='weights') #从(-1,1)的均匀分布中取数,然后返回一个shape为(1, 2)的随机矩阵,(1, 2)表示一行两列
print(weights.name)
bias = tf.Variable(tf.zeros([1]), name='biases')
print(bias.name)
with tf.name_scope('conv1') as scope: # conv1意为一维卷积层
weights = tf.Variable([1.0, 2.0], name='weights')
print(weights.name)
bias = tf.Variable([0.3], name='biases')
print(bias.name)
sess = tf.Session()
writer = tf.summary.FileWriter('./my_graph/2', sess.graph) # 功能:把数据流图写入运行当前程序的子文件夹“./my_graph/2”中
# 在命令行输入: tensorboard --logdir=./my_graph/2,可启动TensorBoard来查看相应的可视化
输出:
hidden/alpha:0
hidden/weights:0
hidden/biases:0
conv1/weights:0
conv1/biases:0
9,TensorFlow中的reduce(reduce_sum,reduce_mean,reduce_max和reduce_min)
留空
10,tf.contrib模块
此模块下面有着及其丰富的功能子模块,具体可参见TensorFlow 的常用模块介绍
如
layers,(类似 nn 里面的函数,一些经典 CNN 方法的重构)
keras,
image,
slim,
tensorboard 等。
10.1 tf.contrib.layers.xavier_initializer的参数说明
xavier_initializer(
uniform=True,
seed=None,
dtype=tf.float32
)该函数返回一个用于初始化权重的初始化程序 “Xavier” 。
这个初始化器是用来保持每一层的梯度大小都差不多相同。
参数:
- uniform: 使用uniform或者normal分布来随机初始化。
- seed: 可以认为是用来生成随机数的seed
- dtype: 只支持浮点数。
返回值:- 初始化权重矩阵
11,TensorFlow中CNN的两种padding方式“SAME”和“VALID”
当CNN用于文本中时,一般卷积层设置卷积核的大小为n×k,其中k为输入向量的维度(即[n,k,input_channel_num,output_channel_num]),这时候我们就需要选择“VALID”填充方式,这时候窗口仅仅是沿着一个维度扫描而不是两个维度。可以理解为统计语言模型当中的N-gram。
对于VALID,输出的形状计算如下:

对于SAME,输出的形状计算如下:

其中,W 为输入的size,F 为filter的size,S 为步长,⌈ ⌉为向上取整符号。
例子如下,详细的注释以后再写。
import tensorflow as tf
import numpy as np
input_forward = tf.random_normal([50, 60, 310, 1])
filt = tf.random_normal([3, 310, 1, 300])
conv = tf.nn.conv2d(
input_forward,
# 具有[batch, in_height, in_width, in_channels]这样的shape,
# 具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数]
filt,
strides=[1, 1, 1, 1],
padding='VALID',
name='conv')
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(conv)
print(conv.shape)
输出:
Tensor("conv:0", shape=(50, 58, 1, 300), dtype=float32)
(50, 58, 1, 300)
输出里面的58和1的来历就是根据上面的公式计算的。注意,如果输入和卷积核都是矩形,那么输出的形状的长和宽分别用上面的公式计算即可。
网友评论