张量分析(由浅入深,你知道分析张量)
神经网络的输入、输出和权值都是张量,神经网络中的各种计算和变换都是对张量的运算。张量,一种数据结构,是神经网络的基石。可以说,不理解张量,就没有真正理解神经网络和人工智能。本文由浅入深地详细讲解了分析张量,希望对读者有所启发——宵远。
张量的定义
张量是一个多维数组,即存储一组数的数据结构,可以通过索引单独访问,也可以通过多个索引进行索引。
张量是向量和矩阵到任意维的推广。如下图所示,张量的维数与张量中用来表示标量值的索引数一致。
新张量=张量[索引]
张量的查看和存储
点击张量的存储。ipynb进行深入研究。以下是该文件的主要内容:
张量,PyTorch中的基本数据结构
索引对PyTorch张量进行操作以探索和处理数据。
与NumPy多维数组的互操作性
将计算转移到GPU以加快速度
张量的视图定义和存储
存储是数字数据的一维数组,例如包含给定类型数字(可能是float或int32)的连续内存块。张量是一种存储的视图,可以通过使用偏移和每个维度的每维度步骤将其索引到存储中。的存储布局永远是一维的,与任何可能涉及它的张量的维数无关。
多个张量可以索引同一个存储,即使它们索引数据的方式不同。但是底层内存只分配一次,所以无论存储实例管理的数据有多大,都可以快速创建数据上的备选张量视图。
张量观的多维意义
张量的观点就是我们如何理解张量,比如形状为[2,4,4,3]的张量A。逻辑上我们可以理解为两张图片,每张4行4列,每个位置都有RGB 3通道的数据;张量的存储体现在,张量作为一个连续的存储区存储在内存中。对于同一个存储,我们可以有不同的理解方式,比如上面的A,在不改变张量存储的情况下,我们可以把张量A理解为两个样本,每个样本的特征都是一个长度为48的向量。这就是存储和视图的关系。
张量存储的一维性
存储数据时,内存不支持这种维度层次的概念,只能按顺序分块写入内存。所以这种层次关系需要人工管理,即需要人工跟踪每个张量的存储顺序。为了表达方便,我们把张量形状左侧的维度称为大维度,形状右侧的维度称为小维度。比如在[2,4,4,3]的张量中,与通道数相比,图片数称为大维,通道数称为小维。在优先写入小尺寸的设置下,形状(2,3)张量的存储布局如下:
[1., 4., 2., 1., 3., 5.]
创建数据时,会根据初始维度顺序写入数据。改变张量的视图只是改变了张量的理解公式,而不改变张量的存储顺序。这在一定程度上是因为计算效率的原因,大量数据的写操作会消耗更多的计算资源。
张量存储的形状(大小)、存储偏移量和步长
为了索引到存储器中,张量依赖于一些信息,这些信息和它们的存储器一起清楚地定义了它们:大小、存储偏移和步长(如下)。
英文意思形状是一个元组,表示张量表示的每个维度上有多少个元素。注意张量的形状等同于存储的大小。Step stride是一个元组,它指示当索引在每个维度上增加1时,存储中必须跳过的元素的数量。存储偏移量storage offset存储张量中第一个元素对应的索引。
在上面的例子中,访问二维张量中的元素(I,j)(i,j)的结果是访问存储中的$ storage _ offset+stride[0]I+stride[1]j $元素。
更一般化:对于形状为(d1,d2,…,dn)的张量的视图中的元素E(e1,e2,…,en)E(e1,e2,…,en),如果张量的存储步长为stride (s1,s2,…,sn)
由此,我们得到张量视图的计算公式:
张量视图=张量存储+张量形状+张量步长+张量偏移
张量存储对张量运算的影响
张量和存储之间的这种间接性导致了一些操作,例如转置一个张量或提取一个子张量。这些操作是廉价的,因为它们不会导致内存重新分配;相反,它们包括为新的张量对象分配不同的形状、存储偏移量或步长值。
张量的维数降低了,而索引的存储空仍然与原来的点张量相同。改变子张量会对原张量产生副作用(子张量的修改会影响原张量)。但这种效应可能不会一直存在,因为子张量可以克隆成新的张量。
没有分配新的内存:转置只能通过创建一个新的张量实例来获得,该实例的步长与原始张量的步长不同。您可以通过重新排列张量函数(如PyTorch中的tense()函数)来强制复制一个张量,使其布局与新创建的张量的布局相同。
张量的表示和存储的区别和联系
接触
对于元素E (E1,E2,...,EN)在张量的视野中,其形状是(D1,D2,...,DN),如果张量的存储步长为(S1,S2,...,Sn)且存储偏移量storage offset为s_o,则元素E的存储位置索引为:
张量视图=张量存储+张量形状+张量步长+张量偏移
区分
同一个存储可以有不同的视图:tensor_B.storage()与tensor_B_transpose.storage()相同,但tensor_B与tensor_B_transpose不同。
同一个视图可以有不同的存储:tensor_A与tensor_B_transpose相同,但tensor_A.storage()与tensor_B_transpose.storage()不同。
摘要:张量视图与存储之间的关系是通过索引建立的。两者之间没有必然,就是同一个存储可以有不同的视图,同一个视图可以有不同的存储。
张量运算
点击TensorFlow张量的常用运算。ipynb了解更多信息。以下是该文件的主要内容:
dtype=int32, float32, string, booltf.convert_to_tensor, tf.constant, tf.zeros, tf.ones, tf.zeros_like, tf.fill, tf.random.normal, tf.random.uniform, tf.rangeA[1][2][1], A[1, 2, 1], A[ :, :, 0:3:2], A[..., 0:3:2]tf.reshape, tf.expand_dims, tf.squeeze, tf.transposetf.tile+, -, *, /, //, %, **, tf.pow, tf.square, tf.sqrt, tf.math.log, tf.matmul, @tf.concat, tf.stack, tf.split, tf.unstacktf.norm, tf.reduce_max min mean sum, tf.argmax, tf.argmintf.equaltf.pad, tf.keras.preprocessing.sequence.pad_sequences, tf.tiletf.maximum, tf.minimum, tf.clip_by_valuetf.gather, tf.gather_ndtf.boolean_masktf.wheretf.scatter_ndtf.meshgrid
以上就是由优质生活领域创作者 嘉文社百科网小编 整理编辑的,如果觉得有帮助欢迎收藏转发~
本文地址:https://www.jwshe.com/602960.html,转载请说明来源于:嘉文社百科网
声明:本站部分文章来自网络,如无特殊说明或标注,均为本站原创发布。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。分享目的仅供大家学习与参考,不代表本站立场。