相关文章:
【一】tensorflow安装、常用python镜像源、tensorflow 深度学习强化学习教学
【二】tensorflow调试报错、tensorflow 深度学习强化学习教学
【三】tensorboard安装、使用教学以及遇到的问题
【四】超级快速pytorch安装
trick1---实现tensorflow和pytorch迁移环境教学
- 张量shape参数理解
代码语言:javascript复制shape参数的个数应为维度数,每一个参数的值代表该维度上的长度
shape=(100,784)
代表该张量有两个维度,第一个维度长度为100,第二个维度长度为784,二维数组100行784列
shape=(2,)
代表该张量有一个维度,第一个维度长度为2,一维数组1行2列
代码语言:javascript复制第几个维度的长度,就是左数第几个中括号组之间的元素总数量
# 例:
[[[1,2,3],[4,5,6]]]
# 第一个维度中只有一个元素[[1,2,3][4,5,6]],所以第一个维度长度为1
# 第二个维度中有两个元素[1,2,3][4,5,6],所以第二个维度长度为2
# 第三个维度中有三个元素“1,2,3”或“4,5,6”,所以第三个维度长度为3
# 那么它的shape参数就是[1,2,3]
- tf.trainable_variables(), tf.global_variables()的使用
tf.trainable_variables():
这个函数可以查看可训练的变量,参数trainable,其默认为True
代码语言:javascript复制__init__(
initial_value=None,
trainable=True,
collections=None,
validate_shape=True,
...
)
对于一些我们不需要训练的变量,将trainable设置为False,这时tf.trainable_variables() 就不会打印这些变量。
举个简单的例子,在下图中共定义了4个变量,分别是一个权重矩阵,一个偏置向量,一个学习率和计步器,其中前两项是需要训练的而后两项则不需要。
代码语言:javascript复制w1 = tf. Variable (tf. randon_normal ([256, 2000]),'w1' )
b1 = tf.get_ variable('b1', [2000])
learning_ rate = tf. Variable(0.5, trainable=False)
global_ step = tf. Variable(0, trainable=False)
代码语言:javascript复制trainable_ params = tf. trainable_ variables()
trainable_ params
[<tf. Variable’Variable:0' shape= (256,2000) dtype=float32_ ref>,
<tf. Variable’ b1:0”shape= (2000,) dtype=float32_ ref>]
另一个问题就是,如果变量定义在scope域中,是否会有不同。实际上,tf.trainable_variables()是可以通过参数选定域名的,如下图所示:
代码语言:javascript复制vith tf. variable_ scope(' var' ):
w2 = tf.get. variable('w2' , [3, 3])
w3 = tf.get. variable(' w3',[3, 3])
我们重新声明了两个新变量,其中w2是在‘var’中的,如果我们直接使用tf.trainable_variables(),结果如下
代码语言:javascript复制trainable. params = tf.trainable.variables ()
trainable_ params
[<tf. Variable’ vrar/w2:0’shape=(3, 3) dtype=float32_ ref>,
<tf. Variable’w3:0' shape=(3, 3) dtype=float32_ ref>]
如果我们只希望查看‘var’域中的变量,我们可以通过加入scope参数的方式实现:
代码语言:javascript复制scope_ parans = tf. trainable_ variables (scope-' var' )
scope par ains
[<tf. Variable ’var/w2:0' shape=(3, 3) dtype=float32_ ref>]
tf.global_variables()
如果我希望查看全部变量,包括我的学习率等信息,可以通过tf.global_variables()来实现。效果如下:
代码语言:javascript复制global parans = tf. global variables()
global_ params
[<tf. Variable,Variable:0' shape=(256, 2000) dtype=float32_ ref>,
<tf. Variable ' b1:0' shape= (2000,) dtype-float32_ ref>,
<tf. Variable。Variable_ 1:0’shape=0 dtype=float32_ ref>,
<tf. Variable' Variable_ 2:0’ shape=() dtype=int32_ ref>]
这时候打印出来了4个变量,其中后两个即为trainable=False的学习率和计步器。与tf.trainable_variables()一样,tf.global_variables()也可以通过scope的参数来选定域中的变量。
- Optimizer.minimize()与Optimizer.compute_gradients()和Optimizer.apply_gradients()的用法
Optimizer.minimize()
minimize()就是compute_gradients()和apply_gradients()这两个方法的简单组合,minimize()的源码如下:
代码语言:javascript复制 def minimize(self, loss, global_step=None, var_list=None,
gate_gradients=GATE_OP, aggregation_method=None,
colocate_gradients_with_ops=False, name=None,
grad_loss=None):
grads_and_vars = self.compute_gradients(
loss, var_list=var_list, gate_gradients=gate_gradients,
aggregation_method=aggregation_method,
colocate_gradients_with_ops=colocate_gradients_with_ops,
grad_loss=grad_loss)
vars_with_grad = [v for g, v in grads_and_vars if g is not None]
if not vars_with_grad:
raise ValueError(
"No gradients provided for any variable, check your graph for ops"
" that do not support gradients, between variables %s and loss %s." %
([str(v) for _, v in grads_and_vars], loss))
return self.apply_gradients(grads_and_vars, global_step=global_step,
name=name)
主要的参数说明:
loss: Tensor
,需要优化的损失;
var_list: 需要更新的变量(tf.Varialble)组成的列表或者元组,默认值为GraphKeys.TRAINABLE_VARIABLES
,即tf.trainable_variables()
注意:
1、Optimizer.minimize(loss, var_list)中,计算loss所涉及的变量(假设为var(loss))包含在var_list中,也就是var_list中含有多余的变量,并不 影响程序的运行,而且优化过程中不改变var_list里多出变量的值;
2、若var_list中的变量个数少于var(loss),则优化过程中只会更新var_list中的那些变量的值,var(loss)里多出的变量值 并不会改变,相当于固定了网络的某一部分的参数值。
compute_gradients()和apply_gradients()
代码语言:javascript复制compute_gradients(self, loss, var_list=None,
gate_gradients=GATE_OP,
aggregation_method=None,
colocate_gradients_with_ops=False,
grad_loss=None):
里面参数的定义与minimizer()函数里面的一致,var_list的默认值也一样。需要特殊说明的是,如果var_list里所包含的变量多于var(loss),则程序会报错。其返回值是(gradient, variable)对所组成的列表,返回的数据格式也都是“tf.Tensor”。我们可以通过变量名称的管理来过滤出里面的部分变量,以及对应的梯度。
apply_gradients()的源码如下:
代码语言:javascript复制apply_gradients(self, grads_and_vars, global_step=None, name=None)
grads_and_vars的格式就是compute_gradients()所返回的(gradient, variable)对,当然数据类型也是“tf.Tensor”,作用是,更新grads_and_vars中variable的梯度,不在里面的变量的梯度不变。