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 构造方法-无参构造方法 本文知识点:构造方法-无参构造方法 说明:因为时间紧张, ...
随机推荐
- 新塘M051 关于 System Tick设置,3种方法操作
关于 System Tick设置,给出3种方法,学习并确认OK: 使用 M051BSPv3.01.001版本 一.使用函数CLK_EnableSysTick() 1 //Enable System T ...
- Vue press 支持图片放大功能的代码分享
介绍 VuePress 由两部分组成:一个以 Vue 驱动的主题系统的简约静态网站生成工具,和一个为编写技术文档而优化的默认主题.它是为了支持 Vue 子项目的文档需求而创建的. 由 VuePress ...
- form-create-designer中怎么扩展自定义组件
form-create-designer中怎么扩展自定义组件 form-create-designer 是基于 @form-create/element-ui实现的表单设计器组件.可以通过拖拽的方式快 ...
- CTF-CRYPTO-ECC(1)
CTF-CRYPTO-ECC(1) 椭圆加密 1.简介 椭圆曲线密码学(Elliptic curve cryptography),简称 ECC,和RSA.ElGamel 算法等类似,是一种公开秘钥加密 ...
- 【数值计算方法】数值积分&微分-python实现
目录 数值积分 1. 引言 2. 几个常用积分公式及其复合公式 2.1 求积公式 2.2 代数精度 2.3 复合积分 2.4 常用积分公式的python实现 3. 变步长方法与外推加速技术 4. 牛顿 ...
- @SpringBootApplication自动配置原理
@EnableAutoConfiguration 是核心,他会调用一个@Import注解.我们已知Import自动配置得实现是通过创建ImportSelector 接口的实现类并重写里面selectI ...
- @ComponentScan @MapperScan 拆分项目的时候,这两个注解很重要
今天,在做项目拆分的时候遇到了个问题,就是将service和dao层拆完之后,项目启动不起开了,如图: 最终解决办法,在启动类上增加两个注解搞定: @ComponentScan(basePackage ...
- Ribbon-Loadbalancer自定义负载均衡策略:本地优先+偏向服务器优先
Ribbon 核心顶层抽象 package com.netflix.loadbalancer; public interface IRule { Server choose(Object var1); ...
- 运维 —— IMP-00030: failed to create file import_sys for write
IMP-00030: failed to create file import_sys for writeIMP-00000: Import terminated unsuccessfully原因:操 ...
- windows端5款mysql客户端工具
1. MySQL Workbench 这属于mysql官方出品,免费,功能强大,是首选. 2. HeidiSQL 免费,功能强大,强烈推荐. 3. dbForge Studio for MySQL 收 ...