4、TensorFlow基础(二)常用API与变量作用域
2021-04-03 00:24
标签:tle lsp return 自己 区别 auto 报错 creat ror 1、图、操作和张量 TensorFlow 的计算表现为数据流图,所以 tf.Graph 类中包含一系列表示计算的操作对象(tf.Operation),以及在操作之间流动的数据 — 张量对象(tf.Tensor)。与图相关的 API 均位于tf.Graph 类中: tf.Operation 类代表图中的一个节点,用于计算张量数据。该类型由节点构造器(如 tf.matmul()或者 Graph.create_op())产生。例如,c = tf.matmul(a, b)创建一个 Operation 类,其类型为 MatMul的操作类。与操作相关的 API 均位于 tf.Operation 类中, tf.Tensor 类是操作输出的符号句柄,它不包含操作输出的值,而是提供了一种在 tf.Session中计算这些值的方法。这样就可以在操作之间构建一个数据流连接,使 TensorFlow 能够执行一个表示大量多步计算的图形。与张量相关的 API 均位于 tf.Tensor 类中 2、可视化 可视化时,需要在程序中给必要的节点添加摘要(summary),摘要会收集该节点的数据,并标记上第几步、时间戳等标识,写入事件文件(event file)中。tf.summary.FileWriter 类用于在目录中创建事件文件,并且向文件中添加摘要和事件,用来在 TensorBoard 中展示。 3、变量作用域 在 TensorFlow 中有两个作用域(scope),一个是 name_scope,另一个是 variable_scope。它们究竟有什么区别呢?简而言之,name_scope主要是给variable_name加前缀,也可以op_name加前缀;name_scope 是给 op_name 加前缀 变量名字由两部分组成:scope/变量name。 name 参数才是对象的唯一标识。 Graph中保存着一个属性_name_stack(string类型),_name_stack的值保存着当前的name_scope的名字,在这个图中创建的对象Variable、Operation、Tensor的名字之前都加上了这个前缀。 #它的主要目的是为了更加方便地管理参数命名。 # 下面是在另外一个命名空间来定义变量的 # 所以,实际上weights1 和 weights2 这两个引用名指向了不同的空间,不会冲突 # 注意,这里的 with 和 python 中其他的 with 是不一样的 注意,tf.Variable再次命名相同变量时(本来又要产生 conv1/weights:0 conv2/weights:0),结果这里产生了(conv1_1/weights:0 conv2_1/weights:0),所以这就是tf.Variable()的一个特性,遇到同名时,产生一个新的,并不共享。 Graph中维护一个collection,这个collection中的 键_VARSCOPE_KEY对应一个 [current_variable_scope_obj],保存着当前的variable_scope。使用 get_variable() 创建变量的时候,就从这个collection 取出 current_variable_scope_obj,通过这个 variable_scope创建变量。 tf.variable_scope() 主要结合 tf.get_variable() 来使用,实现变量共享。 如果tf.variable_scope函数使用参数reuse=None或者reuse=False创建上下文管理器,则tf.get_variable函数可以创建新的变量。但不可以创建已经存在的变量即为同名的变量。 如果tf.variable_scope函数使用参数reuse=True创建上下文管理器,则tf.get_variable函数可以使用已在当前空间定义的变量赋值来创建变量。但不可以使用不存在的变量来创建。 # 这里是正确的打开方式~~~可以看出,name 参数才是对象的唯一标识 # 下面来共享上面已经定义好的变量 # 可以看到这两个引用名称指向的是同一个内存对象 3.1、tf.name_scope()
# 与 tf.Variable() 结合使用。简化了命名
with tf.name_scope(
‘conv1‘
) as scope:
weights1
=
tf.Variable([
1.0
,
2.0
], name
=
‘weights‘
)
bias1
=
tf.Variable([
0.3
], name
=
‘bias‘
)
with tf.name_scope(
‘conv2‘
) as scope:
weights2
=
tf.Variable([
4.0
,
2.0
], name
=
‘weights‘
)
bias2
=
tf.Variable([
0.33
], name
=
‘bias‘
)
print
(weights1.name)
print
(weights2.name)
输出:
conv1/
weights:
0
conv2
/
weights:
0
# 执行完 with 里边的语句之后,这个 conv1/ 和 conv2/ 空间还是在内存中的。这时候如果再次执行上面的代码
# 就会再生成其他命名空间(执行完上面的代码,接着执行这里的,上面的空间还在内存中)
with tf.name_scope(
‘conv1‘
) as scope:
weights1
=
tf.Variable([
1.0
,
2.0
], name
=
‘weights‘
)
bias1
=
tf.Variable([
0.3
], name
=
‘bias‘
)
with tf.name_scope(
‘conv2‘
) as scope:
weights2
=
tf.Variable([
4.0
,
2.0
], name
=
‘weights‘
)
bias2
=
tf.Variable([
0.33
], name
=
‘bias‘
)
print
(weights1.name)
print
(weights2.name)
输出:
conv1_1
/
weights:
0
conv2_1
/
weights:
0
3.2、 tf.variable_scope
with tf.variable_scope(
‘v_scope‘
) as scope1:
Weights1
=
tf.get_variable(
‘Weights‘
, shape
=
[
2
,
3
])
bias1
=
tf.get_variable(
‘bias‘
, shape
=
[
3
])
# note: 在下面的 scope 中的变量必须已经定义过了,才能设置 reuse=True,否则会报错
with tf.variable_scope(
‘v_scope‘
, reuse
=
True
) as scope2:
Weights2
=
tf.get_variable(
‘Weights‘
)
Weights3
=
tf.get_variable(
‘Weights‘
, [
2
,
3
])
#shape如果不同会报错
print
(Weights2.name)
print
(Weights3.name)
输出
v_scope
/
Weights:
0
v_scope
/
Weights:
0
上一篇:C# 文件与路径操作
下一篇:C#浅谈NET抽象类和接口的区别
文章标题:4、TensorFlow基础(二)常用API与变量作用域
文章链接:http://soscw.com/index.php/essay/71601.html