提起张量分析_由浅入深地带你了解分析张量 大家在熟悉不过了,被越来越多的人所熟知,那你知道张量分析_由浅入深地带你了解分析张量 吗?快和小编一起去了解一下吧!
【资料图】
张量分析(由浅入深,你知道分析张量)
神经 *** 的输入、输出和权值都是张量,神经 *** 中的各种计算和变换都是对张量的运算。张量,一种数据结构,是神经 *** 的基石。可以说,不理解张量,就没有真正理解神经 *** 和人工智能。本文由浅入深地详细讲解了分析张量,希望对读者有所启发——宵远。
张量的定义
张量是一个多维数组,即存储一组数的数据结构,可以通过索引单独访问,也可以通过多个索引进行索引。
张量是向量和矩阵到任意维的推广。如下图所示,张量的维数与张量中用来表示标量值的索引数一致。
新张量=张量[索引]
张量的查看和存储
点击张量的存储。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_maxminmeansum,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