TensorFlow 基础 (02)
前面对 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)的更多相关文章
- javascript基础02
javascript基础02 1.数据类型 数据类型的描述在上篇的扩展中有写到链接 由于ECMAScript数据类型具有动态性,因此的确没有再定义其他数据类型的必要.这句话很重要. 如果以后再数据类型 ...
- javaSE基础02
javaSE基础02 一.javac命令和java命令做什么事情? javac:负责编译,当执行javac时,会启动java的编译程序,对指定扩展名的.java文件进行编译,生成了jvm可以识别的字节 ...
- java基础学习05(面向对象基础02)
面向对象基础02 实现的目标 1.String类的使用2.掌握this关键字的使用3.掌握static关键字的使用4.了解内部类 String类 实例化String对象一个字符串就是一个String类 ...
- TensorFlow基础
TensorFlow基础 SkySeraph 2017 Email:skyseraph00#163.com 更多精彩请直接访问SkySeraph个人站点:www.skyseraph.com Over ...
- TensorFlow基础笔记(0) 参考资源学习文档
1 官方文档 https://www.tensorflow.org/api_docs/ 2 极客学院中文文档 http://www.tensorfly.cn/tfdoc/api_docs/python ...
- TensorFlow基础笔记(3) cifar10 分类学习
TensorFlow基础笔记(3) cifar10 分类学习 CIFAR-10 is a common benchmark in machine learning for image recognit ...
- 085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用
085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用 本文知识点:构造方法调用 说明:因为时间紧张,本人写博客过程中只是 ...
- 084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字
084 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 03 构造方法-this关键字 本文知识点:构造方法-this关键字 说明:因为时间紧 ...
- 083 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 02 构造方法-带参构造方法
083 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 02 构造方法-带参构造方法 本文知识点:构造方法-带参构造方法 说明:因为时间紧张, ...
- 082 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 01 构造方法-无参构造方法
082 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 01 构造方法-无参构造方法 本文知识点:构造方法-无参构造方法 说明:因为时间紧张, ...
随机推荐
- Linux 提升CPU利用率
由于同学项目CPU利用率不高,客户要降他们服务器配置,所以下下策. # 提升一个核CPU利用率 cat /dev/urandom | gzip -9 > /dev/null # 提升更大的CPU ...
- Qt个人项目总结 —— MySQL数据库查询与断言
3.Qt项目总结--数据库查询断言问题 问题: 当我使用MySQL数据库的查询操作时, 如果查询的数据在数据库中不存在,那么Qt会直接被干崩溃 但是?为什么呢?不应该是返回if语句中的结果吗,为什么会 ...
- 万字长文手把手教你实现MicroPython/Python发布第三方库
MicroPython/Python 发布第三方库 原文链接: FreakStudio的博客 摘要 文章讲解内容包括第三方库文件说明和组织.开源许可协议选择.通过black模块.Flake8模块和预提 ...
- 【vscode】vscode配置Java
[vscode]vscode配置Java 前言 配环境,需要记录,避免反复踩坑. 步骤 step1:官网走 配环境为什么不直接上官网教程,Visual Studio Code - Co ...
- godoc使用方法介绍
一.go doc简介 Godoc是go语言的文档化工具,类似于文档化工具godoc,类似于Python的Docstring和Java的Javadoc Godoc通过解析包含注释的Go代码来生成HTML ...
- Oracle VM VirtualBox虚拟机安装Centos
virtualBOx 6.x.x版本跟 virtualBOx 5.x.x 界面已经不一样,但安装步骤还是一样的 镜像下载可以使用下面帖子中的,网易镜像或者阿里云镜像,选取适合自己的镜像 开源镜像站,v ...
- oracle服务 linux启动命令
一.Linux下启动Oracle Linux下启动Oracle分为两步: 1)启动监听: 2)启动数据库实例: 1.登录服务器,切换到oracle用户,或者以oracle用户登录 [admin@dat ...
- 爬虫管理平台-TaskPyro的任务管理
官网:https://docs.taskpyro.cn/ 任务管理 TaskPyro提供了强大而灵活的任务管理功能,让您能够轻松创建和管理Python脚本的定时任务. 创建任务 在TaskPyro中创 ...
- docx4j转换HTML并生成word文档实践
一.背景 在项目开发中,有一个需求需要将富文本编辑器中的内容转换为word文档.在网上看了很多开源第三方工具包的对比,最终选择了docx4j,主要原因有一下几点: 可以将html转换为word 对wo ...
- 数据结构-ArrayList-LinkedList--java进阶day09
1.数据结构 2.栈 详细流程:https://kdocs.cn/l/claZP6piLKDW?linkname=150996989 3.队 详细流程:https://kdocs.cn/l/claZP ...