tensorflow 源码解析:https://github.com/horance-liu/tensorflow-internals
https://raw.githubusercontent.com/horance-liu/tensorflow-internals/master/tensorflow-internals.pdf
导数、偏导数、微分、梯度
(1)导数
导数(Derivative),是针对一元变量而言的,当函数y=f(x)的自变量x在一点x0上产生一个增量Δx时,函数输出值的增量Δy与自变量增量Δx的比值在Δx趋于0时的极限。
几何意义:导数描述了一个函数在某一点附近的变化率。当自变量和取值都是实数时为切线斜率。
函数可导的充要条件:左导数和右导数都存在并且相等。
(2)偏导数
偏导数是针对多变量函数的,就是其关于其中一个变量的导数而保持其他变量的值不变。就是其在某一个变量方向上的变化率。
(3)微分
由函数B=f(A),得到A、B两个数集,在A中当dx靠近自己时,函数在dx处的极限叫作函数在dx处的微分,微分的中心思想是无穷分割。
通常把自变量x的增量 Δx称为自变量的微分,记作dx,即dx = Δx。于是函数y = f(x)的微分又可记作dy = f’(x)dx。
函数因变量的微分与自变量的微分之商等于该函数的导数。因此,导数也叫做微商。
几何意义:当Δx很小时,切线纵坐标的增量。
(4)梯度
,梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
tf.control_dependencies()
with tf.control_dependencies(control_inputs)
exec_ops
在执行某些 exec_ops 之前,control_inputs得首先被运行。
但是对于 Variable 的 identity op 会在 control dependence 后重新计算,但其它 op 都不会重新计算。
https://blog.csdn.net/u012436149/article/details/72084744
x = tf.Variable(0.0)
x_plus_1 = tf.assign_add(x, 1)
with tf.control_dependencies([x_plus_1]):
y = x
init = tf.initialize_all_variables()
with tf.Session() as session:
init.run()
for i in xrange(5):
print(y.eval())
print 0, 0, 0, 0, 0
session 中没有 run 这和 x_plus_1 变量,所以 x_plus_1 不会被执行,虽然 control_dependencies 中依赖是 x_plus_1,但是并不会执行这个运算,而是确定被定义了。
x = tf.Variable(0.0)
x_plus_1 = tf.assign_add(x, 1)
with tf.control_dependencies([x_plus_1]):
y = tf.identity(x)
init = tf.initialize_all_variables()
with tf.Session() as session:
init.run()
for i in xrange(5):
print(y.eval())
prints 1, 2, 3, 4, 5
b = tf.identity(a)
返回一个tensor(b),这个tensor(b)的size和shape与输入tensor(a)是相同的。
通常identity与Variable一起使用,并且identity去除了Variable的引用标识,同时也避免了内存拷贝。
还可以用于CPU和GPU等不同设备之间的数据传输,以及与 control_dependencies 配合使用。
tf.global_variables_initializer()
变量初始化:https://www.jianshu.com/p/bebcdfb74fb1
sess.run(tf.global_variables_initializer()) 所做的动作如下
tf.assign()
tf.assign(A, new_number): 这个函数的功能主要是把A的值变为new_number,即 C++ 的 A = new_number;
NoOp
NoOp,即不存在输入,也不存在输出,作用是:通过控制依赖边与该NoOp相连,保证相应的变量运行。
如1:所有的全局变量的初始化器,就是一个NoOp,通过控制依赖边与该NoOp相连,保证所有的全局变量被初始化。
如2:tf.control_dependencies() 中的控制变量也是一个NoOp,用于控制变量的依赖。