今天学了Tensor的定义,做了以下的记录:
a = t.Tensor(1, 2, 3) # 这里1代表的batch,2代表行维度,3代表列维度
a.shape # output:torch.Size([1, 2, 3])
t.ones(2, 3) #创建一个2*3的tensor,所有value都是1
output:
tensor([[1., 1., 1.],
[1., 1., 1.]])
t.zeros(2, 3) #创建一个2*3的tensor,所有value都是0
output:
tensor([[0., 0., 0.],
[0., 0., 0.]])
t.arange(1, 6, 2) #1:哪里开始,6:哪里结束,2:两个数之前相差多少
output:
tensor([1, 3, 5])
t.linspace(1, 10, 3) #间隔起始点、终止端,以及指定分隔值总数(包括起始点和终止点);将1-10平均分成三个数字,1和10已经占了两个了,中间还需要一个
output:
tensor([ 1.0000, 5.5000, 10.0000])
t.randn(2, 3, device=t.device('cpu')) #后面的表示,想用什么device进行存储数据,默认是CPU
output:
tensor([[-0.5485, -0.8044, 1.7384],
[-0.4052, -0.0030, 0.7025]])
t.randperm(5) #它的作用是返回一个大小为5的一维张量,其中包含从1到5的整数,但是这些整数的顺序是随机排列的,每个数只出现一次。
output:
tensor([4, 3, 2, 0, 1])
t.eye(2, 3, dtype=t.int) # 创建一个大小为2*3的二维张量,其中对角线上的元素都是1,其他元素都是0,并且不用行和列的大小相等
output:
tensor([[1, 0, 0],
[0, 1, 0]], dtype=torch.int32)
scalar = t.tensor(3.14159) # 表示一个标量(只有一个值的张量),所以size为空
print('scalar: %s, shape of sclar: %s' %(scalar, scalar.shape)) # %s是Python字符串格式化的一种方式,它可以将后面括号中的值以字符串的形式插入到前面的字符串中,其中%s会被替换成后面括号中的值。
output:
scalar: tensor(3.1416), shape of sclar: torch.Size([])
vector = t.tensor([1, 2])
tensor = t.Tensor(1,2)
区别:
vector = t.tensor([1, 2])创建一个形状为(2,)的一维张量,其值为[1, 2]。这个张量的数据类型将根据输入的值自动推断,通常为整数类型。
tensor = t.Tensor(1, 2)创建一个形状为(1, 2)的二维张量,其中的元素值是未初始化的,也就是说其值未知。该函数使用默认数据类型float32。
matrix = t.tensor([[0.1, 1.2], [2.2, 3.1], [4.9, 5.2]])
# 一个二维张量的形状为(rows, cols),表示这是一个包含rows行和cols列的矩阵。
# 一个三维张量的形状为(depth, rows, cols),表示这是一个包含depth个矩阵,每个矩阵包含rows行和cols列。
x[[1, 2], [1, 2], [2, 0]] # x[1,1,2] and x[2,2,0]
x[[2, 1, 0], [0], [1]] # x[2,0,1],x[1,0,1],x[0,0,1]
x[[0, 2], ...] # x[0] and x[2]
a[0,0] # 也是tensor
a[0,0].item()# 表示获取张量a中第一行第一列的元素,并将其转换为Python标量类型
d = a[0:1, 0:1, None] #取第一维的第一行,第二维的第一行,再增加一个维度,如果a是3维,最后输出四维的d,如果a是4维的,最后输出五维的d
b.unsqueeze(1) # 用于在指定位置插入新的维度。具体来说,它将会在张量 b 的第二个维度(即位置1)插入一个新的维度,从而增加张量的秩(即维度数)。
b.unsqueeze(-2) # 它在 b 的倒数第二个维度上插入了一个新的维度