2.3. 线性代数 — 动手学深度学习 2.0.0 documentation (d2l.ai)
2.3. Linear Algebra — Dive into Deep Learning 1.0.0-beta0 documentation (d2l.ai)
请注意,维度(dimension)这个词在不同上下文时往往会有不同的含义,这经常会使人感到困惑。
为了清楚起见,我们在此明确一下:(向量,轴,张量的维度分别是什么意思)
len
function.shape
attribute. The shape is a tuple that indicates a tensor’s length along each axis.在Python的NumPy库中,数据的形状是由每个轴中元素数量组成的元组,这个元组称为shape。元组的长度就是数据的维数或维度(ndim)。
X.ndim=2
)。矩阵是有用的数据结构:它们允许我们组织具有不同模式的数据。例如,我们矩阵中的行可能对应于不同的房屋(数据样本),而列可能对应于不同的属性。
因此,尽管单个向量的默认方向是列向量,但在表示表格数据集的矩阵中,将每个数据样本作为矩阵中的行向量更为常见。后面的章节将讲到这点,这种约定将支持常见的深度学习实践。
例如,沿着张量的最外轴,我们可以访问或遍历小批量的数据样本。
以下试验采用notebook 运行
A,A.shape,A.size(),A.numel(),len(A),A.ndim
#A.shape和A.size()这里是一样的,描述了张量各个轴上的元素数量(注意numpy的size属性结果是统计张量的所有基本元素数量,相当于pytorch中的.numel()方法)
#len(A)表示张量的最外轴包含的元素数目
# A.ndim表示张量轴数
#
(tensor([[ 0., 1., 2., 3.],[ 4., 5., 6., 7.],[ 8., 9., 10., 11.],[12., 13., 14., 15.],[16., 17., 18., 19.]]),torch.Size([5, 4]),torch.Size([5, 4]),20,5,2)
narr=np.arange(12).reshape(3,4)
narr,narr.size
(array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]]),12)
narr
array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])
保留维数进行求和keepdims
M=K.sum(axis=1,keepdims=True)
N=K.sum(axis=0,keepdims=True)
O=K.sum(axis=0)
P=K.sum(axis=1)
#检查5个求和结果(张量)
K,M,N,O,P
(array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11],[12, 13, 14, 15],[16, 17, 18, 19]]),array([[ 6],[22],[38],[54],[70]]),array([[40, 45, 50, 55]]),array([40, 45, 50, 55]),array([ 6, 22, 38, 54, 70]))
print(K.ndim,M.ndim,N.ndim,O.ndim,P.ndim)
print(K.shape,M.shape,N.shape,O.shape,P.shape)
2 2 2 1 1
(5, 4) (5, 1) (1, 4) (4,) (5,)
张量降维是指将高维张量降低到低维的过程,以便更有效地进行数据处理和分析。在机器学习和数据科学领域,通常使用张量分解技术来实现降维。
常用的张量分解方法包括主成分分析(PCA)、奇异值分解(SVD)、非负矩阵分解(NMF)等。这些方法都可以将高维数据转换为低维表示,使得数据更易于可视化、处理和理解,同时也能减少维度灾难的影响。
在实际应用中,选择合适的张量降维方法需要考虑多个因素,包括原始数据的特点,降维目标和应用场景等。
一个具体的张量降维例子是使用PCA进行图像降维。在这个例子中,将一张图片表示为三维张量,其中xxx和yyy表示像素的坐标,zzz表示颜色(RGB)。例如,一个100×100100\times100100×100的彩色图像可以看作是一个100×100×3100\times100\times3100×100×3的张量。如果我们想将图像的维度降低,可以使用PCA来将三维张量转换为二维张量(或更低维度)。
以下试验用notebook运行
X=torch.arange(24).reshape(2,3,4)
X,X.shape
(tensor([[[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]],[[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]]]),torch.Size([2, 3, 4]))
s1=X.sum(axis=0)
s2=X.sum(axis=1)
s3=X.sum(axis=2)
s=s1,s2,s3
s
(tensor([[12, 14, 16, 18],[20, 22, 24, 26],[28, 30, 32, 34]]),tensor([[12, 15, 18, 21],[48, 51, 54, 57]]),tensor([[ 6, 22, 38],[54, 70, 86]]))
print(X.shape)
for t in s:print(t.shape)
torch.Size([2, 3, 4])
torch.Size([3, 4])
torch.Size([2, 4])
torch.Size([2, 3])
print(X,X.shape)
print('🎈sum in 3 different axis:\n')
sk=[]
for i in range(3):sk.append(X.sum(axis=i,keepdim=True))print(sk[i],sk[i].shape,'\n')# print(sk)
tensor([[[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]],[[12, 13, 14, 15],[16, 17, 18, 19],[20, 21, 22, 23]]]) torch.Size([2, 3, 4])
🎈sum in 3 different axis:tensor([[[12, 14, 16, 18],[20, 22, 24, 26],[28, 30, 32, 34]]]) torch.Size([1, 3, 4]) tensor([[[12, 15, 18, 21]],[[48, 51, 54, 57]]]) torch.Size([2, 1, 4]) tensor([[[ 6],[22],[38]],[[54],[70],[86]]]) torch.Size([2, 3, 1])
我们沿着三个轴(axis=0,1,2)分别进行求和
更一般的,n维张量沿着n个轴中的某个轴axis_i
(并设该轴上由n(i)
个元素)求和,相当于对n(i)个n-1维张量求和(而且他们的shape相同)
sum
和mean
沿指定的轴降低维度。