Tensorflow
tf.get_collection()
主要作用
从一个集合中取出变量
tf.get_collection(
key,
scope=None
)
例子
tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,
scope="hidden[123]")
表示获取第1,2,3隐藏层的权重
tf.stack
作用
对矩阵进行拼接
例子
import tensorflow as tf
a = tf.constant([1, 2, 3])
b = tf.constant([4, 5, 6])
c = tf.stack( [a,b], axis=0)
with tf.Session() as sess:
print(sess.run(c))
output:
[[1 2 3]
[4 5 6]]
tf.unstack
unstack(
value,
num=None,
axis=0,
name='unstack' )
作用
对矩阵进行分解
value:代表需要分解的矩阵变量
axis:指明对矩阵的哪个维度进行分解。
例子
import tensorflow as tf
c = tf.constant([[1, 2, 3],
[4, 5, 6]])
d = tf.unstack(c, axis=0)
e = tf.unstack(c, axis=1)
with tf.Session() as sess:
print(sess.run(d))
print(sess.run(e))
output:
[array([1, 2, 3]), array([4, 5, 6])]
[array([1, 4]), array([2, 5]), array([3, 6])]
optimizer.minimize(loss,var_list)
loss = ...
opt = tf.tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op = opt.minimize(loss)
init = tf.initialize_all_variables()
with tf.Seesion() as sess:
sess.run(init)
for step in range(10):
session.run(train_op)
在源代码中可以知道minimize()实际上包含了两个步骤,即compute_gradients和apply_gradients,前者用于计算梯度,后者用于使用计算得到的梯度来更新对应的variable
computer_gradients(loss,var_list)
作用
用于计算loss对于指定val_list的导数,最终返回的是元组列表
参数含义
loss: 需要被优化的Tensor
val_lsit:loss中需要优化的变量
x = tf.Variable(initial_value=50., dtype='float32')
w = tf.Variable(initial_value=10., dtype='float32')
y = w*x
opt = tf.train.GradientDescentOptimizer(0.1)
grad = opt.compute_gradients(y, [w,x])
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(grad))
output
[(50.0, 10.0), (10.0, 50.0)]
输出解释
可以看到返回了一个list,list中的元素是元组。第一个元组第一个元素是50,表示∂y/∂w的计算结果,第二个元素表示w。第二个元组同理
tf.gradients(loss, tf.variables)的作用和这个函数类似,但是它只会返回计算得到的梯度
即如果把opt.compute_gradients(y, [w,x])换成tf.gradients(loss, tf.variables),则输出结果是[50.0, 10.0]
apply_gradients(self, grads_and_vars, global_step=None, name=None)
作用
with tf.Graph().as_default():
x = tf.Variable(initial_value=3., dtype='float32')
w = tf.Variable(initial_value=4., dtype='float32')
y = w*x
opt = tf.train.GradientDescentOptimizer(0.1)
grads_vals = opt.compute_gradients(y, [w])
for i, (g, v) in enumerate(grads_vals):
if g is not None:
grads_vals[i] = (tf.clip_by_norm(g, 5), v) # clip gradients
train_op = opt.apply_gradients(grads_vals)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(sess.run(grads_vals))
print(sess.run([x,w,y]))
```
**output**
```java
[(3.0, 4.0)]
[3.0, 4.0, 12.0]
computer_gradients和apply_gradients总结
#compute_gradients
opt = tf.train.GradientDescentOptimizer(0.1)
grad = opt.compute_gradients(y, [w,x])
print(sess.run(grad))
#apply_gradients
opt = tf.train.GradientDescentOptimizer(0.1)
grads_vals = opt.compute_gradients(y, [w])
#list包括的是:梯度和更新变量的元组对
capped_gvs = [(tf.clip_by_value(grad, -threshold, threshold), var)
for grad, var in grads_and_vars]
#执行对应变量的更新梯度操作
train_op = opt.apply_gradients(grads_vals)
print(sess.run(grads_vals))
apply_gradients中grads_and_vars的格式就是compute_gradients()所返回的(gradient, variable)对,当然数据类型也是“tf.Tensor”,作用是,更新grads_and_vars中variable的梯度,不在里面的变量的梯度不变,compute_gradients的作用只是计算梯度
tf.group
作用
用于创造一个操作,可以将传入参数的所有操作进行分组
tf.group(
*inputs,
**kwargs
)
ops = tf.group(tensor1, tensor2,…
其中*inputs是0个或者多个用于组合tensor,一旦ops完成了,那么传入的tensor1,tensor2,…等等都会完成了
generator_train_op = tf.train.AdamOptimizer(g_loss, ...)
discriminator_train_op = tf.train.AdamOptimizer(d_loss,...)
train_ops = tf.groups(generator_train_op ,discriminator_train_op)
with tf.Session() as sess:
sess.run(train_ops)
一旦运行了train_ops,那么里面的generator_train_op和discriminator_train_op都将被调用
tf.group()返回的是个操作,而不是值
ops = tf.group(c,d,e)
e = sess.run(ops)
返回的将不是c,d,e的运算结果,而是一个None,就是因为这个是一个操作,而不是一个张量
keras.layers.concatenate(a,b)
作用:矩阵拼接
a = K.variable(np.array([[1 , 2, 3]]))
b = K.variable(np.array([[3 , 2, 1]]))
c1 = K.concatenate([a , b] , axis=0)
c2 = K.concatenate([a , b] , axis=-1)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(sess.run(c1))
print(sess.run(c2))
output:
[[1. 2. 3.]
[3. 2. 1.]]
[[1. 2. 3. 3. 2. 1.]]