0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

五个简单步骤掌握TensorFlow中的Tensor

电子设计 来源:电子设计 作者:电子设计 2020-12-24 14:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在这篇文章中,我们将深入研究Tensorflow Tensor的实现细节。我们将在以下五个简单步骤中介绍与Tensorflow的Tensor中相关的所有主题:第一步:张量的定义→什么是张量?第二步:创建张量→创建张量对象的函数第三步:张量对象的特征第四步:张量操作→索引、基本张量操作、形状操作、广播第五步:特殊张量张量的定义:什么是张量?

张量是TensorFlow的均匀型多维数组,它非常类似于NumPy数组,并且是不可变的,这意味着一旦创建它们就不能被更改。首先,要使用TensorFlow对象,我们需要导入TensorFlow库,因为我们经常将NumPy与TensorFlow一起使用,因此我们也可以导入NumPy:import tensorflow as tf

import numpy as np

张量的创建:创建张量对象有多种方法可以创建tf.Tensor对象,同时也可以使用多个TensorFlow函数来创建张量对象,如下例所示:# 你可以用`tf.constant`函数创建tf.Tensor对象:
x = tf.constant([[1, 2, 3, 4 ,5]])
# 你可以用`tf.ones`函数创建tf.Tensor对象:
y = tf.ones((1,5))
# 你可以用`tf.zeros`函数创建tf.Tensor对象:
z = tf.zeros((1,5))
# 你可以用`tf.range`函数创建tf.Tensor对象:
q = tf.range(start=1, limit=6, delta=1)
print(x)
print(y)
print(z)
print(q)
输出:
tf.Tensor([[1 2 3 4 5]], shape=(1, 5), dtype=int32)
tf.Tensor([[1. 1. 1. 1. 1.]], shape=(1, 5), dtype=float32)
tf.Tensor([[0. 0. 0. 0. 0.]], shape=(1, 5), dtype=float32)
tf.Tensor([1 2 3 4 5], shape=(5,), dtype=int32)

如你所见,我们使用三个不同的函数创建了形状(1,5)的张量对象,使用tf.range()函数创建了形状(5,)的第四个张量对象。注意,tf.ones的和tf.zeros接受形状作为必需的参数,因为它们的元素值是预先确定的。张量对象的特征tf.Tensor创建对象有几个特征。首先,他们有维度数量;其次,它们有一个形状,一个由维度的长度组成的列表;所有张量都有一个大小,即张量中元素的总数;最后,它们的元素都被记录在一个统一的数据类型(datatype)中。让我们仔细看看这些特征。维度张量根据其维数进行分类:Rank-0(标量)张量:包含单个值且没有轴的张量(0维);Rank-1张量:包含单轴(一维)值列表的张量;Rank-2张量:包含2个轴(2维)的张量;以及Rank-N张量:包含N轴的张量(三维)。

例如,我们可以通过向tf.constant传递一个三层嵌套的list对象来创建一个Rank-3张量。我们可以将数字分割成一个3层嵌套的列表,每个层有3个元素:three_level_nested_list = [[[0, 1, 2],
[3, 4, 5]],
[[6, 7, 8],
[9, 10, 11]] ]
rank_3_tensor = tf.constant(three_level_nested_list)
print(rank_3_tensor)
Output:
tf.Tensor( [[[ 0 1 2]
[ 3 4 5]]

[[ 6 7 8]
[ 9 10 11]]],
shape=(2, 2, 3), dtype=int32)

我们可以查看“rank_3_tensor”对象当前具有“.ndim”属性的维度数。tensor_ndim = rank_3_tensor.ndim
print("The number of dimensions in our Tensor object is", tensor_ndim)
Output:
The number of dimensions in our Tensor object is 3

形状形状特征是每个张量都具有的另一个属性,它以列表的形式显示每个维度的大小。我们可以查看使用.shape属性创建的rank_3_tensor对象的形状,如下所示:tensor_shape = rank_3_tensor.shape
print("The shape of our Tensor object is", tensor_shape)
Output:
The shape of our Tensor object is (2, 2, 3

如你所见,我们的张量在第一层有两个元素,第二层有两个元素,第三层有三个元素。大小大小是张量的另一个特征,它表示张量有多少个元素。我们不能用张量对象的属性来测量大小,相反,我们需要使用tf.size函数。最后,我们将使用实例函数.NumPy()将输出转换为NumPy,以获得更具可读性的结果:tensor_size = tf.size(rank_3_tensor).numpy()
print("The size of our Tensor object is", tensor_size)
Output:
The size of our Tensor object is 12

数据类型张量通常包含数字数据类型,如浮点和整数,但也可能包含许多其他数据类型,如复数和字符串。但是,每个张量对象必须将其所有元素存储在一个统一的数据类型中,因此,我们还可以使用.dtype属性查看为特定张量对象选择的数据类型,如下所示:tensor_dtype = rank_3_tensor.dtype
print("The data type selected for this Tensor object is", tensor_dtype)
Output:
The data type selected for this Tensor object is <dtype: 'int32'>

张量运算索引索引是项目在序列中位置的数字表示,这个序列可以引用很多东西:一个列表、一个字符串或任意的值序列。TensorFlow还遵循标准的Python索引规则,这类似于列表索引或NumPy数组索引。关于索引的一些规则:索引从零(0)开始。负索引(“-n”)值表示从末尾向后计数。冒号(“:”)用于切片。逗号(“,”)用于进入更深的维度。让我们用以下几行创建rank_1_tensor:single_level_nested_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
rank_1_tensor = tf.constant(single_level_nested_list)
print(rank_1_tensor)
Output:
tf.Tensor([ 0 1 2 3 4 5 6 7 8 9 10 11],
shape=(12,), dtype=int32)

测试一下我们的规则1,2,3:# 规则1,索引从0开始
print("First element is:",
rank_1_tensor[0].numpy())
# 规则2,负索引
print("Last element is:",
rank_1_tensor[-1].numpy())
# 规则3,切片
print("Elements in between the 1st and the last are:",
rank_1_tensor[1:-1].numpy())
Output:
First element is: 0
Last element is: 11
Elements in between the 1st and the last are: [ 1 2 3 4 5 6 7 8 9 10]

现在,让我们用以下代码创建rank_2_tensor:two_level_nested_list = [ [0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11] ]
rank_2_tensor = tf.constant(two_level_nested_list)
print(rank_2_tensor)
Output:
tf.Tensor( [[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]], shape=(2, 6), dtype=int32)

用几个例子来测试第4条规则:print("The 1st element of the first level is:",
rank_2_tensor[0].numpy())
print("The 2nd element of the first level is:",
rank_2_tensor[1].numpy())
# 规则4, 逗号用于进入更深的维度
print("The 1st element of the second level is:",
rank_2_tensor[0, 0].numpy())
print("The 3rd element of the second level is:",
rank_2_tensor[0, 2].numpy())
Output:
The first element of the first level is: [0 1 2 3 4 5]
The second element of the first level is: [ 6 7 8 9 10 11]
The first element of the second level is: 0
The third element of the second level is: 2

现在,我们已经介绍了索引的基本知识,让我们看看我们可以对张量进行的基本操作。张量基本运算你可以轻松地对张量进行基本的数学运算,例如:加法元素乘法矩阵乘法求最大值或最小值找到Max元素的索引计算Softmax值让我们看看这些运算,我们将创建两个张量对象并应用这些操作。a = tf.constant([[2, 4],
[6, 8]], dtype=tf.float32)
b = tf.constant([[1, 3],
[5, 7]], dtype=tf.float32)

我们可以从加法开始。# 我们可以使用' tf.add() '函数并将张量作为参数传递。
add_tensors = tf.add(a,b)
print(add_tensors)
Output:
tf.Tensor( [[ 3. 7.]
[11. 15.]], shape=(2, 2), dtype=float32)

乘法# 我们可以使用' tf.multiply() '函数并将张量作为参数传递。
multiply_tensors = tf.multiply(a,b)
print(multiply_tensors)
Output:
tf.Tensor( [[ 2. 12.]
[30. 56.]], shape=(2, 2), dtype=float32)
矩阵乘法:# 我们可以使用' tf.matmul() '函数并将张量作为参数传递。
matmul_tensors = tf.matmul(a,b)
print(matmul_tensors)
Output:
tf.Tensor( [[ 2. 12.]
[30. 56.]], shape=(2, 2), dtype=float32)

注意:Matmul操作是深度学习算法的核心,因此,尽管你不会直接使用matmul,但了解这些操作是至关重要的。我们上面列出的其他操作示例:# 使用' tf.reduce_max() '和' tf.reduce_min() '函数可以找到最大值或最小值
print("The Max value of the tensor object b is:",
tf.reduce_max(b).numpy())

# 使用' tf.argmax() '函数可以找到最大元素的索引
print("The index position of the max element of the tensor object b is:",
tf.argmax(b).numpy())

# 使用 tf.nn.softmax'函数计算softmax
print("The softmax computation result of the tensor object b is:",
tf.nn.softmax(b).numpy())
Output:
The Max value of the tensor object b is: 1.0
The index position of the Max of the tensor object b is: [1 1]
The softmax computation result of the tensor object b is: [[0.11920291 0.880797 ] [0.11920291 0.880797 ]]

操纵形状就像在NumPy数组和pandas数据帧中一样,你也可以重塑张量对象。这个变形操作非常快,因为底层数据不需要复制。对于重塑操作,我们可以使用tf.reshape函数# 我们的初始张量
a = tf.constant([[1, 2, 3, 4, 5, 6]])
print('The shape of the initial Tensor object is:', a.shape)
b = tf.reshape(a, [6, 1])
print('The shape of the first reshaped Tensor object is:', b.shape)
c = tf.reshape(a, [3, 2])
print('The shape of the second reshaped Tensor object is:', c.shape)

# 如果我们以shape参数传递-1,那么张量就变平坦化。
print('The shape of the flattened Tensor object is:', tf.reshape(a, [-1]))
Output:
The shape of our initial Tensor object is: (1, 6)
The shape of our initial Tensor object is: (6, 1)
The shape of our initial Tensor object is: (3, 2)
The shape of our flattened Tensor object is: tf.Tensor([1 2 3 4 5 6], shape=(6,), dtype=int32)

如你所见,我们可以很容易地重塑我们的张量对象,但要注意的是,在进行重塑操作时,开发人员的操作必须是合理的,否则,张量可能会混淆,甚至会产生错误。广播当我们尝试使用多个张量对象进行组合操作时,较小的张量可以自动伸展以适应较大的张量,就像NumPy数组一样。例如,当你尝试将标量张量与秩2张量相乘时,标量将被拉伸以乘以每个秩2张量元素。参见以下示例:m = tf.constant([5])
n = tf.constant([[1,2],[3,4]])
print(tf.multiply(m, n))
Output:
tf.Tensor( [[ 5 10]
[15 20]], shape=(2, 2), dtype=int32)

由于广播操作,在对张量进行数学运算时,我们不必担心大小匹配。张量的特殊类型我们常常会生成矩形张量,并将数值存储为元素,但是,TensorFlow还支持不规则或特殊的张量类型,这些类型包括:参差不齐的张量字符串张量稀疏张量

让我们仔细看看每一个都是什么。参差不齐的张量参差不齐张量是沿着尺寸轴具有不同数量元素的张量可以构建不规则张量,如下所示ragged_list = [[1, 2, 3],[4, 5],[6]]
ragged_tensor = tf.ragged.constant(ragged_list)
print(ragged_tensor)
Output:
<tf.RaggedTensor [[1, 2, 3],
[4, 5],
[6]]>

字符串张量字符串张量是存储字符串对象的张量。我们可以建立一个字符串张量,就像你创建一个普通的张量对象一样,但是,我们将字符串对象作为元素而不是数字对象传递,如下所示:string_tensor = tf.constant(["With this",
"code, I am",
"creating a String Tensor"])
print(string_tensor)
Output:
tf.Tensor([b'With this'
b'code, I am'
b'creating a String Tensor'],
shape=(3,), dtype=string)

稀疏张量最后,稀疏张量是稀疏数据的矩形张量。当数据中有空值时,稀疏张量就是对象。创建稀疏张量有点耗时,这里有一个例子:sparse_tensor = tf.sparse.SparseTensor(indices=[[0, 0], [2, 2], [4, 4]],
values=[25, 50, 100],
dense_shape=[5, 5])

# 我们可以把稀疏张量转换成密集张量
print(tf.sparse.to_dense(sparse_tensor))
Output:
tf.Tensor( [[ 25 0 0 0 0]
[ 0 0 0 0 0]
[ 0 0 50 0 0]
[ 0 0 0 0 0]
[ 0 0 0 0 100]], shape=(5, 5), dtype=int32)

结尾本文我们介绍了TensorFlow的张量对象的基础知识。这应该会让你对TensorFlow框架的基本知识了解得更多了。

审核编辑:符乾江


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66831
  • tensorflow
    +关注

    关注

    13

    文章

    331

    浏览量

    61851
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    “点沙成金”的科技奇迹:深入解读芯片制造三大阶段与五大步骤

    芯片是如何“点沙成金”的?本文深度解析芯片制造的三大阶段与五大步骤,从逻辑设计、晶圆拉制,到上百次的光刻-刻蚀循环,揭秘驱动数字世界的微观奇迹。
    的头像 发表于 10-31 10:34 389次阅读
    “点沙成金”的科技奇迹:深入解读芯片制造三大阶段与<b class='flag-5'>五大步骤</b>

    如何将训练好的神经网络模型部署到蜂鸟e203开发板上

    = interpreter->input_tensor(0);// 假设只有一输入张量TfLiteTensor* output_tensor = interpreter->
    发表于 10-22 08:04

    烧录工具操作教程:新手也能快速掌握~

    烧录工具看似复杂,其实操作很简单!现在就为你奉上清晰明了的使用说明,即使是新手也能迅速掌握。 本文就以 Air780EPM 开发板为例,演示烧录工具的使用步骤。   一、生成量产文件 1.
    的头像 发表于 09-26 19:20 418次阅读
    烧录工具操作教程:新手也能快速<b class='flag-5'>掌握</b>~

    【上海晶珩睿莓1开发板试用体验】将TensorFlow-Lite物体归类(classify)的输出图片移植到LVGL9.3界面

    的方式很简单,就是用一extern C关键字即可。 一些在C语言中编译能通过但在C++编译不通过的语法需要修改,C++(或者说g++编译器)要求函数的形参和实参类型必须一致,不一致的地方需要用强转
    发表于 09-21 00:39

    【上海晶珩睿莓1开发板试用体验】TensorFlow-Lite物体归类(classify)

    用。 OpenCV库编译成功之后,就可以新建一线程进行TensorFlow-Lite物体归类了,这里我直接使用现成的pb和pbtxt文件,具体内容不赘述,来看看识别效果:
    发表于 09-12 22:43

    对于新唐的8051芯片,在Keil Debug模式下的单步执行过程定时器可以停止吗?

    对于新唐的8051芯片,在Keil Debug模式下的单步执行过程,定时器可以停止吗?
    发表于 08-26 06:33

    对于新唐的8051芯片,在Keil Debug模式下的单步执行过程,定时器可以停止吗?

    对于新唐的8051芯片,在Keil Debug模式下的单步执行过程,定时器可以停止吗?
    发表于 08-25 07:57

    PCBA加工锡膏选型的“维评估法”

    在PCBA加工,锡膏选型是决定焊接质量、可靠性和生产效率的关键环节。“维评估法”是一种系统化、结构化的选型方法,它从合金成分与性能、工艺适应性、焊接可靠性、兼容性与适用性、成本效益
    的头像 发表于 08-06 09:14 525次阅读
    PCBA加工<b class='flag-5'>中</b>锡膏选型的“<b class='flag-5'>五</b>维评估法”

    SOLIDWORKS建模秘籍——必学的草图与建模技巧

    SOLIDWORKS作为一款功能强大的三维CAD软件,广泛应用于各种设计和产品开发领域。掌握SOLIDWORKS的草图与建模技巧,能够显著提升设计效率,减少错误,并快速将创意转化为现实。以下是必学的SOLIDWORKS草图与
    的头像 发表于 05-26 13:17 837次阅读
    SOLIDWORKS建模秘籍——必学的<b class='flag-5'>五</b><b class='flag-5'>个</b>草图与建模技巧

    M12 接头口连接步骤全解析

    掌握了以上德索工程师总结的M12接头口连接步骤及注意事项,新手也能快速、准确地完成连接工作,为设备的稳定运行提供可靠保障。选择德索精密工业的M12接头,就是选择专业、可靠的连接解决方案。
    的头像 发表于 04-28 09:06 839次阅读
    M12 接头<b class='flag-5'>五</b>口连接<b class='flag-5'>步骤</b>全解析

    用树莓派搞深度学习?TensorFlow启动!

    介绍本页面将指导您在搭载64位Bullseye操作系统的RaspberryPi4上安装TensorFlowTensorFlow是一专为深度学习开发的大型软件库,它消耗大量资源。您可以在
    的头像 发表于 03-25 09:33 963次阅读
    用树莓派搞深度学习?<b class='flag-5'>TensorFlow</b>启动!

    OpenVINO™是否与TensorFlow集成支持Raspberry Pi?

    无法确定OpenVINO™是否与 TensorFlow* 集成支持 Raspberry Pi。
    发表于 03-05 08:26

    150℃无压烧结银最简单步骤

    150℃无压烧结银最简单步骤 作为烧结银的全球领航者,SHAREX善仁新材持续创新,不断超越自我,最近开发出150℃无压烧结银AS9378TB,以其独特的低温处理优势,成为了众多研究与应用
    发表于 02-23 16:31

    TMETRIC:简单步骤将工作区连接到时间跟踪应用程序

    将计时器按钮添加到组合门票 完成这三简单步骤以在 Assembla 启用时间跟踪。设置时间不超过 3 分钟。 注册 TMetric 具有高级计费和报告功能的时间跟踪应用程序 安装浏览器扩展
    的头像 发表于 01-07 09:23 657次阅读
    TMETRIC:<b class='flag-5'>简单步骤</b>将工作区连接到时间跟踪应用程序

    用28335 SPI模块读取LDC1000寄存器数据,单步运行SPIRXBUF的值正常,全速运行值全为1不变,为什么?

    各位专家好,请教一问题: 用28335 SPI模块读取LDC1000寄存器数据(版本号),单步运行SPIRXBUF的值正常,全速运行值全为1不变,请问这是什么原因。附件为我写的程序,是一
    发表于 01-02 07:14