热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Tensorflow:TensorFlow基础(一)

文章目录TensorFlow基础1.数据类型1.1数值类型1.2字符串类型1.3布尔类型2.数值精度2.1读取精度2.2类型转换3.待优化张量4.创建张量4.1从数组、列表对象创建


文章目录

  • TensorFlow基础
    • 1.数据类型
      • 1.1 数值类型
      • 1.2 字符串类型
      • 1.3 布尔类型
    • 2.数值精度
      • 2.1 读取精度
      • 2.2 类型转换
    • 3.待优化张量
    • 4.创建张量
      • 4.1 从数组、列表对象创建
      • 4.2 创建全0或全1张量
      • 4.3 创建自定义数值张量
      • 4.4 创建已知分布的张量
      • 4.4 创建序列


TensorFlow基础

import numpy as np
import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers as layers
physical_devices = tf.config.experimental.list_physical_devices('GPU')
assert len(physical_devices) > 0, "Not enough GPU hardware devices available"
tf.config.experimental.set_memory_growth(physical_devices[0], True)

1.数据类型

Tensorflow主要有3种数据类型:数值型,字符串型,布尔型


1.1 数值类型

标量(Scalar) 单个的实数,如 1.2, 3.4 等

向量(Vector) n 个实数的有序集合,通过中括号包裹,如[1.2],[1.2,3.4]等

矩阵(Matrix) n 行 m 列实数的有序集合,如[[1,2],[3,4]]

标量在 TensorFlow 是如何创建的

# python 语言方式创建标量
a = 1.2
# TF 方式创建标量
aa = tf.constant(1.2)
type(a), type(aa), tf.is_tensor(aa)

(float, tensorflow.python.framework.ops.EagerTensor, True)

如果要使用 TensorFlow 提供的功能函数, 须通过 TensorFlow 规定的方式去创建张量,而不能使用 Python 语言的标准变量创建方式。

x = tf.constant([1,2.,3.3])
# 打印 TF 张量的相关信息
x


# 将 TF 张量的数据导出为 numpy 数组格式
x.numpy()

array([1. , 2. , 3.3], dtype=float32)

与标量不同,向量的定义须通过 List 容器传给 tf.constant()函数。

创建一个元素的向量:

# 创建一个元素的向量
a = tf.constant([1.2])
a, a.shape

(,TensorShape([1]))

创建 3 个元素的向量:

# 创建 3 个元素的向量
a = tf.constant([1,2, 3.])
a, a.shape

(,TensorShape([3]))

定义矩阵

# 创建 2 行 2 列的矩阵
a = tf.constant([[1,2],[3,4]])
a, a.shape

(, TensorShape([2, 2]))

三维张量可以定义为:

# 创建 3 维张量
tf.constant([[[1,2],[3,4]],[[5,6],[7,8]]])

array([[[1, 2],[3, 4]],[[5, 6],[7, 8]]])>

通过传入字符串对象即可创建字符串类型的张量

# 创建字符串
a = tf.constant('Hello, Deep Learning.')
a



1.2 字符串类型

通过传入字符串对象即可创建字符串类型的张量

# 创建字符串
a = tf.constant('Hello, Deep Learning.')
a


在 tf.strings 模块中,提供了常见的字符串类型的工具函数,如小写化 lower()、 拼接
join()、 长度 length()、 切分 split()等。

# 小写化字符串
tf.strings.lower(a)



1.3 布尔类型

布尔类型的张量只需要传入 Python 语言的布尔类型数据,转换成 TensorFlow 内部布尔型即可。

# 创建布尔类型标量
tf.constant(True)


创建布尔类型的向量

# 创建布尔类型向量
tf.constant([True, False])


需要注意的是, TensorFlow 的布尔类型和 Python 语言的布尔类型并不等价,不能通用

# 创建 TF 布尔张量
a = tf.constant(True)
# TF 布尔类型张量与 python 布尔类型比较
print(a is True)
# 仅数值比较
print(a == True)

False
tf.Tensor(True, shape=(), dtype=bool)

2.数值精度

对于数值类型的张量,可以保持为不同字节长度的精度,如浮点数 3.14 既可以保存为
16-bit 长度,也可以保存为 32-bit 甚至 64-bit 的精度。Bit 位越长,精度越高,同时占用的内存空间也就越大。常用的精度类型有 tf.int16, tf.int32, tf.int64, tf.float16, tf.float32, tf.float64,其中 tf.float64 即为 tf.double

在创建张量时,可以指定张量的保存精度

# 创建指定精度的张量
tf.constant(123456789, dtype=tf.int16)


对于浮点数, 高精度的张量可以表示更精准的数据,例如采用 tf.float32 精度保存π时,实际保存的数据为 3.1415927

import numpy as np
# 从 numpy 中导入 pi 常量
np.pi
# 32 位
tf.constant(np.pi, dtype=tf.float32)


如果采用 tf.float64 精度保存π,则能获得更高的精度

tf.constant(np.pi, dtype=tf.float64) # 64 位



2.1 读取精度

通过访问张量的 dtype 成员属性可以判断张量的保存精度

a = tf.constant(np.pi, dtype=tf.float16)# 读取原有张量的数值精度
print('before:',a.dtype)
# 如果精度不符合要求,则进行转换
if a.dtype != tf.float32: # tf.cast 函数可以完成精度转换a = tf.cast(a,tf.float32)
# 打印转换后的精度
print('after :',a.dtype)

before:
after :

2.2 类型转换

系统的每个模块使用的数据类型、 数值精度可能各不相同, 对于不符合要求的张量的类型及精度, 需要通过 tf.cast 函数进行转换

# 创建 tf.float16 低精度张量
a = tf.constant(np.pi, dtype=tf.float16)
# 转换为高精度张量
tf.cast(a, tf.double)


进行类型转换时,需要保证转换操作的合法性, 例如将高精度的张量转换为低精度的张量时,可能发生数据溢出隐患:

a = tf.constant(123456789, dtype=tf.int32)
# 转换为低精度整型
tf.cast(a, tf.int16)


布尔类型与整型之间相互转换也是合法的, 是比较常见的操作

a = tf.constant([True, False])
# 布尔类型转整型
tf.cast(a, tf.int32)


一般默认 0 表示 False, 1 表示 True,在 TensorFlow 中,将非 0 数字都视为 True,

a = tf.constant([-1, 0, 1, 2])
# 整型转布尔类型
tf.cast(a, tf.bool)



3.待优化张量

为了区分需要计算梯度信息的张量与不需要计算梯度信息的张量,TensorFlow 增加了一种专门的数据类型来支持梯度信息的记录:tf.Variabletf.Variable 类型在普通的张量类型基础上添加了 name,trainable 等属性来支持计算图的构建。由于梯度运算会消耗大量的计算资源,而且会自动更新相关参数,对于不需要的优化的张量,如神经网络的输入 X,不需要通过 tf.Variable 封装;相反,对于需要计算梯度并优化的张量,如神经网络层的W 和𝒃,需要通过 tf.Variable 包裹以便 TensorFlow 跟踪相关梯度信息。

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

# 创建 TF 张量
a = tf.constant([-1, 0, 1, 2])
# 转换为 Variable 类型
aa = tf.Variable(a)
# Variable 类型张量的属性, 名字, 是否求导数
aa.name, aa.trainable

('Variable:0', True)

name 属性用于命名计算图中的变量,这套命名体系是 TensorFlow 内部维护的, 一般不需要用户关注 name 属性;
trainable属性表征当前张量是否需要被优化,创建 Variable 对象时是默认启用优化标志,可以设置trainable=False 来设置张量不需要优化。

# 直接创建 Variable 张量
tf.Variable([[1,2],[3,4]])

array([[1, 2],[3, 4]])>

4.创建张量


4.1 从数组、列表对象创建

通过 tf.convert_to_tensor 函数可以创建新 Tensor,并将保存在 Python List 对象或者Numpy Array 对象中的数据导入到新 Tensor 中。

# 从列表创建张量
tf.convert_to_tensor([1,2.])


# 从数组中创建张量
tf.convert_to_tensor(np.array([[1,2.],[3,4]]))

array([[1., 2.],[3., 4.]])>

4.2 创建全0或全1张量

创建全 0 的矩阵

# 创建全 0 矩阵,指定 shape 为 2 行 2 列
tf.zeros([2,2])

array([[0., 0.],[0., 0.]], dtype=float32)>

创建全 1 的矩阵

# 创建全 1 矩阵,指定 shape 为 3 行 2 列
tf.ones([3,2])

array([[1., 1.],[1., 1.],[1., 1.]], dtype=float32)>

通过 tf.zeros_like, tf.ones_like 可以方便地新建与某个张量 shape 一致, 且内容为全 0 或全 1 的张量。

# 创建一个矩阵
a = tf.ones([2,3])
# 创建一个与 a 形状相同,但是全 0 的新矩阵
tf.zeros_like(a)

array([[0., 0., 0.],[0., 0., 0.]], dtype=float32)>

创建与张量A形状一样的全 1 张量

# 创建一个矩阵
a = tf.zeros([3,2])
# 创建一个与 a 形状相同,但是全 1 的新矩阵
tf.ones_like(a)

array([[1., 1.],[1., 1.],[1., 1.]], dtype=float32)>

4.3 创建自定义数值张量

通过 tf.fill(shape, value) 可以创建全为自定义数值 value 的张量,形状由 shape 参数指定。

# 创建 2 行 2 列,元素全为 99 的矩阵
tf.fill([2,2], 99)

array([[99, 99],[99, 99]])>

4.4 创建已知分布的张量

通过 tf.random.normal(shape, mean=0.0, stddev=1.0)可以创建形状为 shape,均值为mean,标准差为 stddev 的正态分布 N(mean,stddev2)\mathcal{N}(mean, stddev^2)N(mean,stddev2)

# 创建标准正态分布的张量
tf.random.normal([2,2])

array([[0.4479265 , 1.2336508 ],[0.96864706, 2.076528 ]], dtype=float32)>

通过 tf.random.uniform(shape, minval=0, maxval=None, dtype=tf.float32) 可以创建采样自[minval, maxval)区间的均匀分布的张量

# 创建采样自[0,1)均匀分布的矩阵
tf.random.uniform([3,2])

array([[0.5197921 , 0.80691314],[0.38051474, 0.05250001],[0.18329549, 0.8741617 ]], dtype=float32)>

# 创建采样自[0,10)均匀分布的矩阵
tf.random.uniform([2,2],maxval=10)

array([[0.4374528 , 7.3671246 ],[2.1262336 , 0.12584329]], dtype=float32)>

如果需要均匀采样整形类型的数据,必须指定采样区间的最大值 maxval 参数,同时指定数据类型为 tf.int*型

# 创建采样自[0,100)均匀分布的整型矩阵
tf.random.uniform([2,2],maxval=100,dtype=tf.int32)

array([[15, 50],[38, 84]])>

4.4 创建序列

tf.range(limit, delta=1) 可以创建[0, limit)之间,步长为 delta 的整型序列,不包含 limit 本身。

# 0~10,不包含 10
tf.range(10)


# 创建 0~10,步长为 2 的整形序列
tf.range(10,delta=2)


tf.range(1,10,delta=2) # 1~10



推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了源码分析--ConcurrentHashMap与HashTable(JDK1.8)相关的知识,希望对你有一定的参考价值。  Concu ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了Java的公式汇总及相关知识,包括定义变量的语法格式、类型转换公式、三元表达式、定义新的实例的格式、引用类型的方法以及数组静态初始化等内容。希望对读者有一定的参考价值。 ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • C++语言入门:数组的基本知识和应用领域
    本文介绍了C++语言的基本知识和应用领域,包括C++语言与Python语言的区别、C++语言的结构化特点、关键字和控制语句的使用、运算符的种类和表达式的灵活性、各种数据类型的运算以及指针概念的引入。同时,还探讨了C++语言在代码效率方面的优势和与汇编语言的比较。对于想要学习C++语言的初学者来说,本文提供了一个简洁而全面的入门指南。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了一个Python函数same_set,用于判断两个相等长度的数组是否包含相同的元素。函数会忽略元素的顺序和重复次数,如果两个数组包含相同的元素,则返回1,否则返回0。文章还提供了函数的具体实现代码和样例输入输出。 ... [详细]
  • HashMap的扩容知识详解
    本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
  • 学习笔记17:Opencv处理调整图片亮度和对比度
    一、理论基础在数学中我们学过线性理论,在图像亮度和对比度调节中同样适用,看下面这个公式:在图像像素中其中:参数f(x)表示源图像像素。参数g(x)表示输出图像像素。 ... [详细]
author-avatar
yvli心语
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有