前面对 tensorflow 的基础数据类型, 数值, 字符串, 布尔等, 有初步认识,尤其是重点的 tensor 张量, 包含了, 标量, 向量, 矩阵 ... 这样的基本概念. 我现在回过头来看, 其实这些编程概念和数学概念, 如果不那么严格区分的话, 其表现形式大体上是相似的. 编程语言的这些基本数据类型, 数据结构, 让一些数学概念能够更好地被认识和理解, 比如, 积分的概念, 线性代数中, 向量, 矩阵的认识... 这些从编程来认识, 则是多么直观和自然啊.

明天要过 6.1 儿童节了, 对我而言, 其实是意味着, 2020 过去了一半, 而编程技术有没有提高呢, 这是我最关系的点. 当然我也相信这块是 唯手熟尔, 每天坚持学习和练习, 终有一天, 能够让别人看到吧.

不扯了... 继续整学习笔记, 学一波 tensorflow, 成为一把工具人, 虽然很多算法的数学原理我已能推导, 但应用上还是有欠缺,这正好是用工具来进行弥补的.

读取数值精度

通过张量的 dtype 属性, 可以访问和修改其保存的精度, 转换用 tf.cast() 来实现.

# 精度调整

tf_arr = tf.constant([1, 2, 3])

print('before:', tf_arr.dtype)
# 对精度进行转换: tf.cast()
if tf_arr.dtype != tf.float32:
tf_arr = tf.cast(tf_arr, tf.float32) print('after', tf_arr.dtype)
before: <dtype: 'int32'>
after <dtype: 'float32'>

类型转换

同上, 类型, 精度啥的, 为了满足特定需求, 需要进行转换, 也是用 tf.cast() 函数来实现转换哦.

from math import pi

# 创建 tf.float16 低精度张量
arr = tf.constant(pi, dtype=tf.float16)
print(arr)
# 转为 tf.float64 高精度张量
tf.cast(arr, tf.float64)
tf.Tensor(3.14, shape=(), dtype=float16)

<tf.Tensor: id=10, shape=(), dtype=float64, numpy=3.140625>

转换时需注意操作的合理性, 如要将高精度的张量转为低精度的张量, 可能会发生 数据溢出的风险哦.

# 高精度 => 低精度 => 数据溢出

print(tf.cast(arr, tf.int8))
tf.Tensor(3, shape=(), dtype=int8)

似乎溢出好像也没报错, 当然我们都知道, 精度下降了而已. 另外, 布尔类型 和 整形 之间的转换也是可以的哦.

# bool => int32 即吧 True, False 转为了 1,0
arr = tf.constant([True, False])
tf.cast(arr, tf.int32)
<tf.Tensor: id=14, shape=(2,), dtype=int32, numpy=array([1, 0])>

一般都是默认 0 表示 False, 1 表示 True, 在 tf 中, 将 非 0 的数字都视为 True , 跟 Python 差不多哈. Python 中的 布尔是, 除了, False, None, 0, [ ], ( ), { } ...外, 都是 True 的呀.

arr = tf.constant([-1, 0, 1, 2])
print(tf.cast(arr, tf.bool))
tf.Tensor([ True False  True  True], shape=(4,), dtype=bool)

待优化张量

在计算中, 一般要区分张量为两拨. 需要计算梯度信息的张量, 和无需算梯度的张量.

TensorFlow 增加了一种数据类型 tf.Variable 来支持 需要进行梯度计算的张量. tf.Variable 类型, 在普通的张量类型上, 新增了 name, trainable 等属性来支持计算图的构建.

为啥要 tf.Variable

tf 是是一种图计算网络嘛, 熟悉神经网络的小伙伴也都清楚, 整个训练过程就是一直在计算梯度, 每层..循环迭代. 梯度计算会消耗大量的计算资源, 而且会 自动更新相关参数.

  • 对于不需要优化的张量, 如神经网络输入 x 这个一维向量, 就不需要 tf.Variable 封装;

  • 而需要求梯度的张量, 如神经网络层的 \(W_{ij}, b_j\) 需要 tf.Variable 来存储, 和跟踪梯度信息

通过 tf.Variable( ) 函数, 即可将普通的张量, 转换为待优化的张量.

# 待优化张量
tf_arr = tf.constant([-1, 0, 1, 2])
print(tf_arr) # 转为 Variable 类型
tf_arr_v = tf.Variable(tf_arr)
print(tf_arr_v)
# Variable 特有属性
print(tf_arr_v.name, tf_arr_v.trainable)
tf.Tensor([-1  0  1  2], shape=(4,), dtype=int32)

<tf.Variable 'Variable:0' shape=(4,) dtype=int32, numpy=array([-1,  0,  1,  2])>

Variable:0 True

name 和 trainable 属性是 Variable 类型特有的. name 用于命名计算图变量, 当然这些命名是 tf 自己内部维护的, 就跟那个 mongodb 自己生成的 ID 是一样的吧. trainable 属性表示当前张量是否需要被优化, 默认 trainable=False.

# 直接创建 tf.Variable
tf_arr = tf.Variable([[1,2,3], [4,5,6]]) print(tf_arr)
<tf.Variable 'Variable:0' shape=(2, 3) dtype=int32, numpy=
array([[1, 2, 3],
[4, 5, 6]])>

这些优化或者被特殊对待的张量, 目的就是上面说的可以跟踪梯度信息 list. 普通的张量, 也可以通过 GradientTape.watch( ) 方法临时加入公祖梯度信息的列表, 从而也能 自动求导. 类似于 sodu 下, 临时用用.

小结

  • 获取精度用 dtype 属性, 直接获取即可, 转换用 tf.cast( ) 实现, 会生成新的 tf 对象哦.
  • 类型转换 也是用 tf.cast( ), 低精度 => 高精度 ok, 但反之则可能数据溢出, 测了没有报错, 精度降低了而已
  • tf.Variable( ) 是"特殊" 的张量, 能跟踪自动求导的梯度信息, 由 trainable = False / True 来指定.

TensorFlow 基础 (02)的更多相关文章

  1. javascript基础02

    javascript基础02 1.数据类型 数据类型的描述在上篇的扩展中有写到链接 由于ECMAScript数据类型具有动态性,因此的确没有再定义其他数据类型的必要.这句话很重要. 如果以后再数据类型 ...

  2. javaSE基础02

    javaSE基础02 一.javac命令和java命令做什么事情? javac:负责编译,当执行javac时,会启动java的编译程序,对指定扩展名的.java文件进行编译,生成了jvm可以识别的字节 ...

  3. java基础学习05(面向对象基础02)

    面向对象基础02 实现的目标 1.String类的使用2.掌握this关键字的使用3.掌握static关键字的使用4.了解内部类 String类 实例化String对象一个字符串就是一个String类 ...

  4. TensorFlow基础

    TensorFlow基础 SkySeraph  2017 Email:skyseraph00#163.com 更多精彩请直接访问SkySeraph个人站点:www.skyseraph.com Over ...

  5. TensorFlow基础笔记(0) 参考资源学习文档

    1 官方文档 https://www.tensorflow.org/api_docs/ 2 极客学院中文文档 http://www.tensorfly.cn/tfdoc/api_docs/python ...

  6. TensorFlow基础笔记(3) cifar10 分类学习

    TensorFlow基础笔记(3) cifar10 分类学习 CIFAR-10 is a common benchmark in machine learning for image recognit ...

  7. 085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用

    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用 本文知识点:构造方法调用 说明:因为时间紧张,本人写博客过程中只是 ...

  8. 084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字

    084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字 本文知识点:构造方法-this关键字 说明:因为时间紧 ...

  9. 083 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 02 构造方法-带参构造方法

    083 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 02 构造方法-带参构造方法 本文知识点:构造方法-带参构造方法 说明:因为时间紧张, ...

  10. 082 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 01 构造方法-无参构造方法

    082 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 01 构造方法-无参构造方法 本文知识点:构造方法-无参构造方法 说明:因为时间紧张, ...

随机推荐

  1. Common.Logging+log4net搭建项目日志框架

    原文参考链接:https://www.cnblogs.com/heys/p/5787123.html   Common.Logging+(log4net/NLog/) common logging是一 ...

  2. nginx 如何强制跳转 https

    本项目 nginx 作为代理服务 项目上线,客户说要加个安全证书 ,于是安全证书是加上了,可是htttp和https都能访问网站,客户要求不行必须强制用带有https的地址访问 开整 这是 http ...

  3. docker - [05] 部署Nginx

    题记部分 一.查找镜像 docker search nginx 二.拉取镜像 docker pull nginx 三.启动镜像 Nginx默认端口号为80,可以在启动时指定Nginx使用的端口号(例如 ...

  4. deepseek:以php为例,获取令牌后下一步处理步骤

    在 PHP 中,获取到 Bearer Token 后,下一步通常是验证令牌的有效性,并根据令牌中的信息处理请求.以下是详细的步骤和代码示例: 1. 获取 Authorization 头中的令牌 首先, ...

  5. 解密prompt系列50. RL用于优化Agent行为路径的一些思路

    OpenAI新推出的Deep Research功能,属实有些惊艳,也验证了去年的一些观点,之后的大模型工作流会呈现一些截然不同的形态,有敏捷型的例如语音端到端的及时对话,也会有异步长流程的复杂任务,去 ...

  6. js里一些实在想不通的问题合集

    The global NaN property is a value representing Not-A-Number. --MDN NaN 是用来表示一个非数字的值得全局属性, 但是typeof之 ...

  7. Linux环境 Oracle 监听和服务 日常操作

    文章目录                    一.Oracle监听                    1.1. 查看Oracle监听运行状态                    1.2. 启动 ...

  8. 可视化|MapBoxGL

    注册Proton Mail 用户名 密码 人机验证 昵称 设置恢复方法-选择稍后再说-确定 注册MapBoxGL 填写后 Finish creating your account 一开始之前记得选择U ...

  9. 再谈MCP协议,看看 MCP 是如何重塑 AI 与外部数据源互动的能力?

    Techscribe Central 缩略图由 Techscribe Central 制作和编辑 MCP!!是不是一头雾水?我当时也是这个反应.我也是最近才听说它开始引发关注,然后我发现大多数人根本不 ...

  10. [每日算法 - 华为机试] 剑指 Offer 10- II. 青蛙跳台阶问题

    入口 力扣https://leetcode.cn/problems/qing-wa-tiao-tai-jie-wen-ti-lcof/ 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该 ...