最近在学习深度学习的相关知识,建议将学习吴恩达老师深度学习视频与学习《TensorFlow实战Google深度学习框架》一书结合起来交错进行。同时推荐一个学习吴恩达老师深度学习的GitHub地址,能够方便地对授课内容进行回顾总结,https://github.com/fengdu78/deeplearning_ai_books。这一系列笔记,主要是对《TensorFlow实战Google深度学习框架》中遇到的API进行整理,以便后续回顾。
目录
tf.get_variable()与tf.Variable()
tf.global_variables_initializer()与tf.local_variables_initializer()
tf.variable_scope("", reuse=True)
Ch3 TensorFlow入门
tf.Graph().as_default()
tf.Graph() 表示实例化了一个类,一个用于 tensorflow 计算和表示用的数据流图,通俗来讲就是:在代码中添加的操作(画中的结点)和数据(画中的线条)都是画在纸上的“画”,而图就是呈现这些画的纸,你可以利用很多线程生成很多张图,但是默认图就只有一张。
tf.Graph().as_default() 表示将这个类实例,也就是新生成的图作为整个 tensorflow 运行环境的默认图,如果只有一个主线程不写也没有关系,tensorflow 里面已经存好了一张默认图,可以使用tf.get_default_graph()来调用(显示这张默认纸),当你有多个线程就可以创造多个tf.Graph(),就是你可以有一个画图本,有很多张图纸,这时候就会有一个默认图的概念了。
tf.get_variable()与tf.Variable()
tf.Variable()
# 用于生成一个初始值为initial-value的变量。必须指定初始化值
W = tf.Variable(<initial-value>, name=<optional-name>)
tf.get_variable()
# 获取已存在的变量(要求不仅名字,而且初始化方法等各个参数都一样),如果不存在,就新建一个。
可以用各种初始化方法,不用明确指定值。
W = tf.get_variable(name, shape=None, dtype=tf.float32, initializer=None,
regularizer=None, trainable=True, collections=None)
区别
推荐使用tf.get_variable(), 因为:
1. 初始化更方便
比如用xavier_initializer:
W = tf.get_variable("W", shape=[784, 256],
initializer=tf.contrib.layers.xavier_initializer())
2. 方便共享变量
因为tf.get_variable() 会检查当前命名空间下是否存在同样name的变量,可以方便共享变量。而tf.Variable 每次都会新建一个变量。需要注意的是tf.get_variable() 要配合reuse和tf.variable_scope() 使用。
tf.ones_initializer()
神经网络中经常使用常量初始化方法来初始化偏置项。当初始化一个维数很多的常量时,一个一个指定每个维数上的值很不方便,tf提供了 tf.zeros_initializer() 和 tf.ones_initializer() 类,分别用来初始化全0和全1的tensor对象。
import tensorflow as tf
init_zeros=tf.zeros_initializer()
init_ones = tf.ones_initializer
with tf.Session() as sess:
x = tf.get_variable('x', shape=[8], initializer=init_zeros)
y = tf.get_variable('y', shape=[8], initializer=init_ones)
x.initializer.run()
y.initializer.run()
print(x.eval())
print(y.eval())
#output:
# [ 0. 0. 0. 0. 0. 0. 0. 0.]
# [ 1. 1. 1. 1. 1. 1. 1. 1.]
tf.global_variables_initializer()与tf.local_variables_initializer()
f.global_variables_initializer()添加节点用于初始化所有的变量(GraphKeys. GLOBAL_VARIABLES)。返回一个初始化所有全局变量的操作(Op)。在你构建完整个模型并在会话中加载模型后,运行这个节点,能够将所有的变量一步到位的初始化,非常的方便。通过feed_dict, 你也可以将指定的列表传递给它,只初始化列表中的变量。
sess.run(tf.global_variables_initializer(),
feed_dict={
learning_rate_dis: learning_rate_val_dis,
adam_beta1_d_tf: adam_beta1_d,
learning_rate_proj: learning_rate_val_proj,
lambda_ratio_tf: lambda_ratio,
lambda_l2_tf: lambda_l2,
lambda_latent_tf: lambda_latent,
lambda_img_tf: lambda_img,
lambda_de_tf: lambda_de,
adam_beta1_g_tf: adam_beta1_g,
})
# learning_rate_dis为设置的变量,learning_rate_val_dis为我设置的具体的值。后续同理
tf.local_variables_initializer()返回一个初始化所有局部变量的操作(Op)。初始化局部变量(GraphKeys.LOCAL_VARIABLE)。GraphKeys.LOCAL_VARIABLE中的变量指的是被添加入图中,但是未被储存的变量。
tf.variable_scope("", reuse=True)
tf.variable_scope()用来指定变量的作用域,作为变量名的前缀,支持嵌套,如下:
with tf.variable_scope("foo"):
with tf.variable_scope("bar"):
v = tf.get_variable("v", [1])
assert v.name == "foo/bar/v:0"
reuse这一项参数设置为True,一般与tf.get_variable()联合使用,表示重用已经创建的变量。
with tf.variable_scope("foo"):
v = tf.get_variable("v", [1])
with tf.variable_scope("foo", reuse=True):
v1 = tf.get_variable("v", [1])
assert v1 is v
当前环境的作用域可以通过函数tf.get_variable_scope()获取,并且reuse标志可以通过调用reuse_variables()设置为True,这个非常有用,如下
with tf.variable_scope("foo"):
v = tf.get_variable("v", [1])
tf.get_variable_scope().reuse_variables()
v1 = tf.get_variable("v", [1])
assert v1 is v
tf.InteractiveSession ()
tf.InteractiveSession()默认自己就是用户要操作的session,而tf.Session()没有这个默认,因此用eval()启动计算时需要指明session。例如:
import tensorflow as tf
import numpy as np
a=tf.constant([[1., 2., 3.],[4., 5., 6.]])
b=np.float32(np.random.randn(3,2))
c=tf.matmul(a,b)
init=tf.global_variables_initializer()
sess=tf.Session()
print (c.eval())
这样会报错,需要修改为print (c.eval(session=sess))或者with sess.as_default():或者with tf.Session() as sess。如果不想采用以上的三种方式,可以使用tf.InteractiveSession ():
import tensorflow as tf
import numpy as np
a=tf.constant([[1., 2., 3.],[4., 5., 6.]])
b=np.float32(np.random.randn(3,2))
c=tf.matmul(a,b)
init=tf.global_variables_initializer()
sess=tf.InteractiveSession()
print (c.eval())
tf.ConfigProto()
config = tf.ConfigProto(allow_soft_placement=True, allow_soft_placement=True)
config.gpu_options.per_process_gpu_memory_fraction = 0.4 #占用40%显存
sess = tf.Session(config=config)
1. 记录设备指派情况 : tf.ConfigProto(log_device_placement=True)
设置tf.ConfigProto()中参数log_device_placement = True ,可以获取到 operations 和 Tensor 被指派到哪个设备(几号CPU或几号GPU)上运行,会在终端打印出各项操作是在哪个设备上运行的。
2. 自动选择运行设备 : tf.ConfigProto(allow_soft_placement=True)
在tf中,通过命令 "with tf.device('/cpu:0'):",允许手动设置操作运行的设备。如果手动设置的设备不存在或者不可用,就会导致tf程序等待或异常,为了防止这种情况,可以设置tf.ConfigProto()中参数allow_soft_placement=True,允许tf自动选择一个存在并且可用的设备来运行操作
tf.reduce_mean()
tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。
import tensorflow as tf
x = [[1,2,3],
[1,2,3]]
xx = tf.cast(x,tf.float32)
mean_all = tf.reduce_mean(xx, keep_dims=False)
mean_0 = tf.reduce_mean(xx, axis=0, keep_dims=False)
mean_1 = tf.reduce_mean(xx, axis=1, keep_dims=False)
with tf.Session() as sess:
m_a,m_0,m_1 = sess.run([mean_all, mean_0, mean_1])
print m_a # output: 2.0
print m_0 # output: [ 1. 2. 3.]
print m_1 #output: [ 2. 2.]
值得注意的是,在tf或者np的api中,一般来说遇到的axis参数,0都是代表列(第一维),1是代表行(第二维)。与tf.reduce_sum类型的函数类似的还有tf.reduce_sum、tf.reduce_max、tf.reduce_all(计算tensor指定轴方向上的各个元素的逻辑和),tf.reduce_any(计算tensor指定轴方向上的各个元素的逻辑或)。
RandomState
from numpy.random import RandomState
rdm = RandomState(1) #伪随机数的随机种子
X = rdm.rand(128,2) #在训练神经网络时,这是np为我们提供的一种生产数据的方式,128代表128组数据,2代表输入数据的两个特征
其它
tf.random_normal():用于从服从正态分布的数值中取出指定个数的数值。
tf.matmul():稍微值得注意的是tf.multiply()是两个矩阵中的对应元素相乘,tf.matmul()是矩阵相乘得到的结果。
tf.sigmoid(y) 计算 x 元素的sigmoid.具体来说,就是:y = 1/(1 + exp (-x))。
tf.log():计算元素 x 的自然对数。
tf.clip_by_value():tf.clip_by_value(A, min, max):输入一个张量A,把A中的每一个元素的值都压缩在min和max之间。小于min的让它等于min,大于max的元素的值等于max。