TF2 基础 (3) : Variables 介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TF2 基础 (3) : Variables 介绍相关的知识,希望对你有一定的参考价值。

参考技术A

本文是对 官方文档 的学习笔记。

TF2 用 tf.Variable 类来存储变量(Tensor 是常量)。 tf.keras 就是用 variables 来存储参数的。

可以用一个 Tensor 来初始化一个 Variable, Variable 内部的数据类型回合 Tensor 的 dtype 一致。

Variable 看起来和 Tensor 差不多, 而实际上 Variable 的数据结构就是由 Tensor 支撑的。 类似 Tensor, variable 也有 dtype, shape 属性, 同时,它也可以被转成Numpy。 大多数 Tensor 的函数, 都可以用在 Variable上面, 但是 Variable 不支持 reshape。

可以利用 assign 对 Variable 赋值, Variable 会重复利用已有内存。 所以, Variable 被assign的 Tensor 的shape 必须 和初始化的shape 一致(Variable 不可以改变shape)

从现有 Variable 创建一个新的Variable 会导致创建新的对象, (不像 python 是引用, TF2 是真对象)

Python 版的 TF2 中, Variable 的生命周期和其他 Python 对象一致, 如果引用消失则会自动被回收。

Variable 可以有自己的 “名字”, 注意这里说的的“名字” 指的不是变量名, 而是 TF2 规定的, 每个 Variable 可以有的“名字”。

保存和加载模型时,将保留变量名称。默认情况下,模型中的变量将自动获取唯一的变量名,因此除非你愿意,否则不需要自己分配它们。

尽管变量对于区分很重要,但是某些变量将不需要区分。你可以通过在创建时将可训练设置为false来关闭变量的渐变。

TF2 会自动把 Tensor 和 Variable 放到运行最快的地方, 这就意味着如果有 GPU 的话, 大部分变量会被放置在GPU上。 然而, 开发者可以设定这个选项, 强制将float 类型数据放在CPU 上运行。

可以在一个设备上设置 variable 或 tensor 的位置,并在另一个设备上进行计算。由于需要在设备之间复制数据,因此会引入延迟。 但是,如果您有多个GPU工作程序,但只想要变量的一个副本,那copy 就不可避免。

分布式计算参考: our guide .

为啥在 TF2 中不推荐使用 convert_variables_to_constants()?

【中文标题】为啥在 TF2 中不推荐使用 convert_variables_to_constants()?【英文标题】:Why is convert_variables_to_constants() deprecated in TF2?为什么在 TF2 中不推荐使用 convert_variables_to_constants()? 【发布时间】:2019-11-13 08:55:27 【问题描述】:

正如标题所说,为什么在 tensorflow 2 中不推荐使用 convert_variables_to_constants()?获取可保存模型以加载到下游独立应用程序以进行推理(在我的情况下,使用 C API)的简单替代方法是什么。

【问题讨论】:

【参考方案1】:

在 TF 2.x 中没有 tf.Session(),这是在 TF 1.x 中构建冻结模型的必要组件,在 TF 2.0 中不再存在。

根据TensorFlow 2.0.0 release description“删除了 freeze_graph 命令行工具;应使用 SavedModel 代替冻结图。”因此,您只能使用SavedModel

但是,如果您仍然需要冻结图表,您

# Save model to SavedModel format
tf.saved_model.save(model, "./models/simple_model")

# Convert Keras model to ConcreteFunction
full_model = tf.function(lambda x: model(x))
full_model = full_model.get_concrete_function(
    x=tf.TensorSpec(model.inputs[0].shape, model.inputs[0].dtype))

# Get frozen ConcreteFunction
frozen_func = convert_variables_to_constants_v2(full_model)
frozen_func.graph.as_graph_def()

layers = [op.name for op in frozen_func.graph.get_operations()]

然后将其保存为冻结图。

注意:您现在应该使用 TF 1.x 加载此冻结图 函数,

tf.io.write_graph(graph_or_graph_def=frozen_func.graph,
                  logdir="./frozen_models",
                  name="simple_frozen_graph.pb",
                  as_text=False)

然后加载这个模型(TF 1.x 代码)你会做-

with tf.io.gfile.GFile("./frozen_models/simple_frozen_graph.pb", "rb") as f:
    graph_def = tf.compat.v1.GraphDef()
    loaded = graph_def.ParseFromString(f.read())

freeze_graph 减少的延迟对于应用程序可能非常重要,存储在SavedModel 中的全精度权重可能是一个问题。但是也有一些简单的方法可以解决这个问题,这超出了这个问题的范围。

【讨论】:

以上是关于TF2 基础 (3) : Variables 介绍的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow编程基础

TF2 深度学习实战(十五):YOLOv4目标检测网络实战

tensorflow基础知识

Less基础

ROS2极简总结-坐标变换-TF

ROS2机器人坐标工具→tf2静态广播←Python