动手学深度学习4 线性代数

动手学深度学习4 线性代数

1. 线性代数–数学意义

视频https://www.bilibili.com/video/BV1eK4y1U7Qy/?spm_id_from=autoNext&vd_source=eb04c9a33e87ceba9c9a2e5f09752ef8
课件https://courses.d2l.ai/zh-v2/assets/pdfs/part-0_5.pdf

本节主要是介绍线性代数中 向量 矩阵的一些定义及计算规则。

1. 标量的简单计算及长度

1. 简单操作 一些简单的数学公式。

c = a + b
c = a · b
c = sin a

2. 标量的长度

|a| =(a ifa > 0 −a otherwise)
|a + b| ≤ |a| + |b|
|a · b| = |a|·|b|

2. 向量的简单计算及长度

1. 简单操作

c = a + b where ci = ai + bi
c = α · b where ci = αbi
c = sin a where ci = sin ai

2. 向量的长度:向量每个元素的平方求和再开根号

∥ a ∥ = ∑ i = 1 n a i 2 \| \mathbf{a} \| = \sqrt{\sum_{i=1}^{n} a_i^2} a=i=1nai2
∥ a ∥ = [ ∑ i = 1 n a i 2 ] 1 2 \| \mathbf{a} \| = [{\sum_{i=1}^{n} a_i^2}]^{\frac{1}{2}} a=[i=1nai2]21
∥ a ∥ = [ ∑ i = 1 n a i 2 ] 1 2 \| \mathbf{a} \| = \left[ \sum_{i=1}^{n} a_i^2 \right]^{\frac{1}{2}} a=[i=1nai2]21
||a|| >= 0 for all a
∣ ∣ a + b ∣ ∣ < = ∣ ∣ a ∣ ∣ + ∣ ∣ b ∣ ∣ ||a+b|| <= ||a|| + ||b|| ∣∣a+b∣∣<=∣∣a∣∣+∣∣b∣∣
∣ ∣ a ⋅ b ∣ ∣ = ∣ a ∣ ⋅ ∣ ∣ b ∣ ∣ ||a \cdot b|| = |a| \cdot ||b|| ∣∣ab∣∣=a∣∣b∣∣ 如果a是一个标量

上面三种数学公式的markdown语法
$\| \mathbf{a} \| = \sqrt{\sum_{i=1}^{n} a_i^2}$
$\| \mathbf{a} \| = [{\sum_{i=1}^{n} a_i^2}]^{\frac{1}{2}}$
$\| \mathbf{a} \| = \left[ \sum_{i=1}^{n} a_i^2 \right]^{\frac{1}{2}}$
$||a+b|| <= ||a|| + ||b||$
$||a \cdot b|| = |a| \cdot ||b||$

在这里插入图片描述

3. 向量点乘 正交

正交向量【互为90°垂直】的点乘为0.
在这里插入图片描述

3. 矩阵

1. 简单操作

C = A + B where Cij = Aij + Bij 对应位置元素相加
C = α · B where Cij = αBij 对每个元素都做标量相乘
C = sin A where Cij = sin Aij 对每个元素都做取sin

2. 矩阵乘法 矩阵乘以向量

在这里插入图片描述
矩阵乘法,是对空间的扭曲
在这里插入图片描述

3. 矩阵乘法 矩阵乘以矩阵

第一个矩阵第一行和第二个矩阵的每一列,对应位置元素做乘法再求和,是结果矩阵的第一行的元素的值。
在这里插入图片描述

4. 范数–矩阵的长度

一般用F范数表示,矩阵范数算起来比较麻烦一般不算。
在这里插入图片描述

5. 特殊矩阵

在矩阵对角画一条线,如图第二个矩阵,在线的两边值是一样的【图上标的颜色块一样】,是对称矩阵。
在线的两边值是正好是负的【图上标的颜色块和边框颜色一样】,是反对称矩阵,如图第三个矩阵。
正定矩阵是说它如果是正定的,则乘以任意一个列向量或者行向量都是大于等于0的,深度学习不会用到太多这个矩阵。
在这里插入图片描述
在这里插入图片描述

6. 特征向量

矩阵,把一个空间进行扭曲,而被矩阵作用后不改变方向的向量叫特征向量,大小改变没关系只需要方向没变就行。不是每个矩阵都能有特征向量。
在这里插入图片描述

7. 补充学习线性代数知识

线性代数课程https://www.bilibili.com/video/BV1ys411472E/?p=1&vd_source=eb04c9a33e87ceba9c9a2e5f09752ef8

2. 线性代数的pytorch实现

视频https://www.bilibili.com/video/BV1eK4y1U7Qy/?p=2&spm_id_from=pageDriver&vd_source=eb04c9a33e87ceba9c9a2e5f09752ef8
课件:https://zh-v2.d2l.ai/chapter_preliminaries/linear-algebra.html

1. 标量

数值计算

import torch
x = torch.tensor(2.0)
y = torch.tensor(3.0)
x, y, x+y, x-y, x*y, x/y, x**y, x*x, y*y
(tensor(2.),
 tensor(3.),
 tensor(5.),
 tensor(-1.),
 tensor(6.),
 tensor(0.6667),
 tensor(8.),
 tensor(4.),
 tensor(9.))

2. 向量

向量可以被视为标量值组成的列表。
人们通过一维张量表示向量。一般来说,张量可以具有任意长度,取决于机器的内存限制。
向量的长度通常称为向量的维度(dimension)
向量或轴的维度被用来表示向量或轴的长度,即向量或轴的元素数量。 然而,张量的维度用来表示张量具有的轴数。 在这个意义上,张量的某个轴的维数就是这个轴的长度。

定义一个向量,索引切片访问向量元素, 向量也可以查看shape, shape列表只有一个元素值,是向量的长度大小

x = torch.arange(12)
x, x[3], x.shape, len(x)
(tensor([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]),
 tensor(3),
 torch.Size([12]),
 12)

3. 矩阵

1. 矩阵转置

矩阵的转置,将列变成行【将行变成列】的一个翻转

X = torch.arange(20).reshape(5,4)
X, X.T
(tensor([[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11],
         [12, 13, 14, 15],
         [16, 17, 18, 19]]),
 tensor([[ 0,  4,  8, 12, 16],
         [ 1,  5,  9, 13, 17],
         [ 2,  6, 10, 14, 18],
         [ 3,  7, 11, 15, 19]]))

2. 对称矩阵

方阵的一种特殊类型,对称矩阵(symmetric matrix)A等于其转置: A = A T A = A^T A=AT
沿对角线两边的元素值是一样的,对角线的元素值不关心。

A = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
A, A.T, A==A.T
(tensor([[1, 2, 3],
         [2, 0, 4],
         [3, 4, 5]]),
 tensor([[1, 2, 3],
         [2, 0, 4],
         [3, 4, 5]]),
 tensor([[True, True, True],
         [True, True, True],
         [True, True, True]]))

from 课件:
矩阵是有用的数据结构:它们允许我们组织具有不同模式的数据。 例如,我们矩阵中的行可能对应于不同的房屋(数据样本),而列可能对应于不同的属性。 曾经使用过电子表格软件或已阅读过 2.2节的人,应该对此很熟悉。 因此,尽管单个向量的默认方向是列向量,但在表示表格数据集的矩阵中, 将每个数据样本作为矩阵中的行向量更为常见。 后面的章节将讲到这点,这种约定将支持常见的深度学习实践。 例如,沿着张量的最外轴,我们可以访问或遍历小批量的数据样本。

4. 张量

1. 按元素加法

就像向量是标量的推广,矩阵是向量的推广一样,我们可以构建具有更多轴的数据结构。

A = torch.arange(24).reshape(2, 3, 4)
B = A.clone()  # 通过分配新内存,将A的一个副本分配给B  B=A不会重新分配内存只是重新指定索引
A, A+B

从中括号的外层,层层递进剥开,确定张量的维度。

(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]]]),
 tensor([[[ 0,  2,  4,  6],
          [ 8, 10, 12, 14],
          [16, 18, 20, 22]],
 
         [[24, 26, 28, 30],
          [32, 34, 36, 38],
          [40, 42, 44, 46]]]))

2. 按元素乘法 哈达玛积

两个矩阵的按元素乘法称为Hadamard积(Hadamard product)("⊕"和"⊕"都表示Hadamard积的符号 ⊙ 。)⊕ ⊕

&oplus;  # ⊕
&#8853;  # ⊕
A * B
tensor([[[  0,   1,   4,   9],
         [ 16,  25,  36,  49],
         [ 64,  81, 100, 121]],

        [[144, 169, 196, 225],
         [256, 289, 324, 361],
         [400, 441, 484, 529]]])

将张量乘以或加上一个标量不会改变张量的形状,其中张量的每个元素都将与标量相加或相乘。

a = 2
A, a+A, a*A, (a*A).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]]]),
 tensor([[[ 2,  3,  4,  5],
          [ 6,  7,  8,  9],
          [10, 11, 12, 13]],
 
         [[14, 15, 16, 17],
          [18, 19, 20, 21],
          [22, 23, 24, 25]]]),
 tensor([[[ 0,  2,  4,  6],
          [ 8, 10, 12, 14],
          [16, 18, 20, 22]],
 
         [[24, 26, 28, 30],
          [32, 34, 36, 38],
          [40, 42, 44, 46]]]),
 torch.Size([2, 3, 4]))

3. 降维求和

1. 求所有元素和–降维到标量 .sum()

X.sum() 是降维求和,会将高维张量变为低维张量甚至标量,不指定从哪个维度求和,求出来的是标量。

import torch
x = torch.arange(4, dtype=torch.float32)
print(x, x.sum())
A = torch.arange(20, dtype=torch.float32).reshape((5,4))
A, A.shape, A.sum()
tensor([0., 1., 2., 3.]) tensor(6.)
(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]),
 tensor(190.))
2. 按维度-轴求和–降一维或多维 .sum(axis=0)
A_axis0_sum = A.sum(axis=0)  # A 5行4列矩阵  矩阵沿0轴降维 第0维形状消失 按行元素相加求和
print(A_axis0_sum, A_axis0_sum.shape)

A_axis1_sum = A.sum(axis=1)   # 同上  按列元素相加求和
print(A_axis1_sum, A_axis1_sum.shape)

A_axis01_sum = A.sum(axis=[0,1])   # 同上  按行求和后再按列求和 所有元素求和  同A.sum()
print(A_axis01_sum, A_axis01_sum.shape)
tensor([40., 45., 50., 55.]) torch.Size([4])   
tensor([ 6., 22., 38., 54., 70.]) torch.Size([5])
tensor(190.) torch.Size([])
3. 除了求和 还可以求平均值 .mean() .mean(axis=0)
print(A.sum(), A.numel(), A.sum()/A.numel(), A.mean())
A.mean(axis=0), A.mean(axis=1), A.mean(axis=[0,1])
tensor(190.) 20 tensor(9.5000) tensor(9.5000)
(tensor([ 8.,  9., 10., 11.]),
 tensor([ 1.5000,  5.5000,  9.5000, 13.5000, 17.5000]),
 tensor(9.5000))

4. 非降维求和

在求和函数的基础上,使用keepdims=True参数。可以理解把求和后的标量值,加上一层中括号,虽然只有一个元素但是也是一个维度。

import torch
A = torch.arange(20, dtype=torch.float32).reshape((5,4))
sum_A = A.sum(axis=0, keepdims=True)
sum_A1 = A.sum(axis=1, keepdims=True)
A, A.shape, A.sum(), sum_A, sum_A.shape, sum_A1, sum_A1.shape
(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]),
 tensor(190.),
 tensor([[40., 45., 50., 55.]]),
 torch.Size([1, 4]),
 tensor([[ 6.],
         [22.],
         [38.],
         [54.],
         [70.]]),
 torch.Size([5, 1]))

如果要做广播,维度的个数需要保持一致。深度学习里面可能会用到这种广播求特征、均值方差等。

A/sum_A

sum_A 从[1,4]广播到[5,4], 再按对应元素做除法

tensor([[0.0000, 0.0222, 0.0400, 0.0545],
        [0.1000, 0.1111, 0.1200, 0.1273],
        [0.2000, 0.2000, 0.2000, 0.2000],
        [0.3000, 0.2889, 0.2800, 0.2727],
        [0.4000, 0.3778, 0.3600, 0.3455]])

沿轴做同列元素的累计求和, 对比两个矩阵,可以看出结果第二行是原始矩阵第一行和第二行同列元素的和,第三行是原始矩阵第一行第二行和第三行同列元素的和,以此类推。

A, A.cumsum(axis=0)
(tensor([[ 0.,  1.,  2.,  3.],
         [ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.],
         [12., 13., 14., 15.],
         [16., 17., 18., 19.]]),
 tensor([[ 0.,  1.,  2.,  3.],
         [ 4.,  6.,  8., 10.],
         [12., 15., 18., 21.],
         [24., 28., 32., 36.],
         [40., 45., 50., 55.]]))

5. 向量点积

向量点积: 是相同位置的按元素乘积的和,求出来的是一个标量

import torch
x = torch.arange(4, dtype=torch.float32)
y = torch.arange(4, dtype=torch.float32)
x_doty = torch.dot(x, y)
x, y, x_doty, torch.sum(x*y)
(tensor([0., 1., 2., 3.]), tensor([0., 1., 2., 3.]), tensor(14.), tensor(14.))

在这里插入图片描述

6. 矩阵向量积

A = torch.arange(20, dtype=torch.float32).reshape((5,4))
x = torch.arange(4, dtype=torch.float32)
A.shape, x.shape, torch.mv(A, x), torch.mv(A, x).shape # m matrix v vextor

矩阵mn 向量n1, 矩阵向量积m*1

(torch.Size([5, 4]),
 torch.Size([4]),
 tensor([ 14.,  38.,  62.,  86., 110.]),
 torch.Size([5]))

在这里插入图片描述

7. 矩阵-矩阵乘法

A = torch.arange(20, dtype=torch.float32).reshape((5,4))
B = torch.arange(12, dtype=torch.float32).reshape((4,3))
A.shape, B.shape, torch.mm(A, B).shape, torch.mm(A,B)

矩阵mn 向量ns, 矩阵向量积m*s

(torch.Size([5, 4]),
 torch.Size([4, 3]),
 torch.Size([5, 3]),
 tensor([[ 42.,  48.,  54.],
         [114., 136., 158.],
         [186., 224., 262.],
         [258., 312., 366.],
         [330., 400., 470.]]))

在这里插入图片描述

8. 范数 向量或是矩阵的长度

在这里插入图片描述

1. L2范数 所有向量元素平方和的平方根
x = torch.arange(4, dtype=torch.float32)
x, torch.norm(x)
(tensor([0., 1., 2., 3.]), tensor(3.7417))
2. L1范数 所有向量元素的绝对值之和

在这里插入图片描述

x = torch.arange(4, dtype=torch.float32)
x, torch.abs(x).sum()
(tensor([0., 1., 2., 3.]), tensor(6.))
3. 矩阵的F范数 所有矩阵元素平方和的平方根 矩阵最常用范数–好算

在这里插入图片描述

A = torch.arange(20, dtype=torch.float32).reshape((5,4))
torch.norm(A)
tensor(49.6991)

3. 按特定轴求和

视频:https://www.bilibili.com/video/BV1eK4y1U7Qy?p=3&spm_id_from=pageDriver&vd_source=eb04c9a33e87ceba9c9a2e5f09752ef8
详细讲
在这里插入图片描述

A = torch.ones((2, 5, 4))
print(A, A.shape)
print(A.sum(), A.sum().shape) # []为空 是标量
print(A.sum(axis=1), A.sum(axis=1).shape)
print(A.sum(axis=1, keepdims=True), A.sum(axis=1, keepdims=True).shape)
print(A.sum(axis=[1,2]), A.sum(axis=[1,2]).shape)
print(A.sum(axis=[1,2], keepdims=True), A.sum(axis=[1,2], keepdims=True).shape)
tensor([[[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]],

        [[1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.],
         [1., 1., 1., 1.]]]) torch.Size([2, 5, 4])
tensor(40.) torch.Size([])
tensor([[5., 5., 5., 5.],
        [5., 5., 5., 5.]]) torch.Size([2, 4])
tensor([[[5., 5., 5., 5.]],

        [[5., 5., 5., 5.]]]) torch.Size([2, 1, 4])
tensor([20., 20.]) torch.Size([2])
tensor([[[20.]],

        [[20.]]]) torch.Size([2, 1, 1])

4. 线性代数QA

1. 字符串转向量这么转换有什么影响吗?比如数值变得稀疏

字符串转向量,比如有一列100个字符串,转数值类向量需要增加100列,但是好多值大部分情况下都是0状态,会变得稀疏。稀疏化会带来很多事情,会存大量的0,内存存不下,可以用稀疏矩阵来存储。对机器学习来说,是否稀疏没有关系。

2. 为什么深度学习要用张量来表示

机器学习,统计的计算机实现,统计常用张量。一路发展过来的

3. copy和clone的区别,是关于内存吗

copy有深copy浅copy不一定会复制内存,clone是一定会复制内存的,可以理解为深copy

4. 对哪一维求和就是消掉哪一维,可以这样理解吗

可以这样理解。

5. torch不区分行向量和列向量吗

一维张量一定是行向量,列向量是一个矩阵,只不过是m1的矩阵。如果一定要区分,可以都把他们当做一个矩阵来处理,行向量:1行m列矩阵 列向量:m行*1列矩阵。
向量在计算机上就是一维数组,可以做累积。

6. sum(axis=[0,1])怎么求

针对矩阵第0维、第一维做求和。

7. torch中L1 L2正则项要怎么加入?

8. 稀疏的时候可以把它当做单词做词向量吗

词向量 word embedding, 稀疏的时候可以用词向量查表做, 但词向量不是所有时候都能做的。大部分情况下可以用词向量embedding来解决稀疏的问题,解决nlp问题常用。

9. 张量的概念,机器学习和数学里有什么主要区别

机器学习的张量,其实是多维数组,用numpy表示的话就是ndarray,不是数学意义上的张量。深度学习大部分都是矩阵的运算。

10. 这门课是不是只讲关于基于pytorch的神经网络算法?学习其他框架可以先听这个课吗

框架工具的使用和算法的学习应该是分开的。
学会不变的东西:
工具:理解是怎么实现的。就算是新的工具出现,实现的概念是不变的,可以迁移。
算法:理解算法是怎么工作的。即使有新算法,工作原理也是不变的,可以迁移。

11. 病理图片的SVS格式,和医生勾画区域的XML格式,怎么进行预处理呢

  1. 当成图片处理,用像素集来表示,手写数字识别
  2. XML当成结构化输入来表示,nlp 计算机视觉处理

12. 稀疏化之后有什么好的解决办法吗?稀疏矩阵?

13. 可以着重讲算法提出的过程的直觉和数学吗,更多了解算法背后的why?

尽可能按当前理解的讲,不保证未来这个理解还对。

练习

  • 标量、向量、矩阵和张量是线性代数中的基本数学对象。
  • 向量泛化自标量,矩阵泛化自向量。
  • 标量、向量、矩阵和张量分别具有零、一、二和任意数量的轴。
  • 一个张量可以通过sum和mean沿指定的轴降低维度。
  • 两个矩阵的按元素乘法被称为他们的Hadamard积。它与矩阵乘法不同。
  • 在深度学习中,我们经常使用范数,如L1范数、L2范数和Frobenius范数。
  • 我们可以对标量、向量、矩阵和张量执行各种操作。
import torch
# 1. 证明一个矩阵A的转置的转置是A
A = torch.arange(20, dtype=torch.float32).reshape(5,4)
print(A, A.T.T, A==A.T.T)
# 2.给出两个矩阵A和B,证明“它们转置的和”等于“它们和的转置”
B = torch.arange(20, dtype=torch.float32).reshape(5,4)
print((A+B).T, A.T+B.T, A.T+B.T==(A+B).T)
# 3. 给定任意方阵A,A加A的转置总是对称的吗?为什么?
A = torch.rand(5,5)
print(A, A.T, A+A.T)  # A+A.T 对称位置值互相加,加出来的对称位置的值总是一样的
print((A+A.T) == (A+A.T).T) # 对称矩阵 A等于A的转置
# 4.节中定义了形状(2,3,4)的张量X。len(X)的输出结果是什么?
X = torch.rand(2,3,4)
print(X.shape, len(X))  # 从Python多重列表的角度去理解,对列表的求长度,是对最外层列表求长度,是第0维长度
# 5.对于任意形状的张量X,len(X)是否总是对应于X特定轴的长度?这个轴是什么?
print(X.shape, len(X))  # 同4 ,len(X)总是对应于X特定轴-第0轴的长度,对列表的求长度,是对最外层列表求长度,是第0维长度
# 6. 运行A/A.sum(axis=1),看看会发生什么。请分析一下原因?
# 广播的条件
# 1.对于每对输入张量的每个维度,它们的长度要么相等,要么其中一个为1。
# 2.当输入张量的长度不相等时,会在较小的张量上重复元素,使它们的维度相匹配
# A = torch.arange(20, dtype=torch.float32).reshape(5,4)
# print(A/A.sum(axis=1)) # 认为求和后的向量shape为1*5, shape和A的5*4维度不匹配,无法做广播机制导致执行失败
A = torch.arange(25, dtype=torch.float32).reshape(5,5)
print(A/A.sum(axis=1))  # 认为求和后的向量shape为1*5,广播机制补足后,shape和A的5*5维度匹配
A = torch.arange(20, dtype=torch.float32).reshape(4,5)
print(A/A.sum(axis=0))  # 认为求和后的向量shape为1*5,广播机制补足后,shape和A的4*5维度匹配
# 7. 考虑一个具有形状(2,3,4)的张量,在轴0、1、2上的求和输出是什么形状?
X = torch.rand(2,3,4)
print(X.sum(axis=0).shape, X.sum(axis=1).shape, X.sum(axis=2).shape)
# 8. 为linalg.norm函数提供3个或更多轴的张量,并观察其输出。对于任意形状的张量这个函数计算得到什么?  
# 范数  np.linalg.norm()用于求范数,linalg本意为linear(线性) + algebra(代数),norm则表示范数。求的是L2范数
import numpy as np
X = torch.rand(2,3,4)
print(np.linalg.norm(X))
print(torch.norm(X))  # 和上面的np结果一致 都是求的L2范数  对于矩阵则是F范数
tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.],
        [12., 13., 14., 15.],
        [16., 17., 18., 19.]]) tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.],
        [12., 13., 14., 15.],
        [16., 17., 18., 19.]]) tensor([[True, True, True, True],
        [True, True, True, True],
        [True, True, True, True],
        [True, True, True, True],
        [True, True, True, True]])
tensor([[ 0.,  8., 16., 24., 32.],
        [ 2., 10., 18., 26., 34.],
        [ 4., 12., 20., 28., 36.],
        [ 6., 14., 22., 30., 38.]]) tensor([[ 0.,  8., 16., 24., 32.],
        [ 2., 10., 18., 26., 34.],
        [ 4., 12., 20., 28., 36.],
        [ 6., 14., 22., 30., 38.]]) tensor([[True, True, True, True, True],
        [True, True, True, True, True],
        [True, True, True, True, True],
        [True, True, True, True, True]])
tensor([[0.6404, 0.2544, 0.4772, 0.4076, 0.4532],
        [0.2251, 0.3049, 0.9265, 0.7494, 0.8111],
        [0.2565, 0.7712, 0.1901, 0.3521, 0.9428],
        [0.1673, 0.4992, 0.8518, 0.2377, 0.4733],
        [0.6197, 0.6000, 0.0031, 0.0500, 0.8565]]) tensor([[0.6404, 0.2251, 0.2565, 0.1673, 0.6197],
        [0.2544, 0.3049, 0.7712, 0.4992, 0.6000],
        [0.4772, 0.9265, 0.1901, 0.8518, 0.0031],
        [0.4076, 0.7494, 0.3521, 0.2377, 0.0500],
        [0.4532, 0.8111, 0.9428, 0.4733, 0.8565]]) tensor([[1.2809, 0.4795, 0.7337, 0.5748, 1.0729],
        [0.4795, 0.6098, 1.6977, 1.2486, 1.4110],
        [0.7337, 1.6977, 0.3802, 1.2038, 0.9459],
        [0.5748, 1.2486, 1.2038, 0.4754, 0.5233],
        [1.0729, 1.4110, 0.9459, 0.5233, 1.7131]])
tensor([[True, True, True, True, True],
        [True, True, True, True, True],
        [True, True, True, True, True],
        [True, True, True, True, True],
        [True, True, True, True, True]])
torch.Size([2, 3, 4]) 2
torch.Size([2, 3, 4]) 2
tensor([[0.0000, 0.0286, 0.0333, 0.0353, 0.0364],
        [0.5000, 0.1714, 0.1167, 0.0941, 0.0818],
        [1.0000, 0.3143, 0.2000, 0.1529, 0.1273],
        [1.5000, 0.4571, 0.2833, 0.2118, 0.1727],
        [2.0000, 0.6000, 0.3667, 0.2706, 0.2182]])
tensor([[0.0000, 0.0294, 0.0526, 0.0714, 0.0870],
        [0.1667, 0.1765, 0.1842, 0.1905, 0.1957],
        [0.3333, 0.3235, 0.3158, 0.3095, 0.3043],
        [0.5000, 0.4706, 0.4474, 0.4286, 0.4130]])
torch.Size([3, 4]) torch.Size([2, 4]) torch.Size([2, 3])
2.6298172
tensor(2.6298)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值