Tensorflow

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.]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值