pytorch的tensor

 PyTorch的Tensor这么简单,你还用不明白吗? - 掘金 (juejin.cn)

Tensor翻译成汉语就是张量:

  • 单个数字叫常量或者标量

  • 一维数组叫向量

  • 二维数组叫矩阵

  • 更高维的叫张量

相对于Numpy,Pytorch的优势在于每个操作都可以在GPU上执行。默认情况下张量都是创建在CPU上的,我们需要显式地将张量移动到GPU上,但是要知道跨设备复制大张量有很大的时间和内存开销。

# 如果GPU可用的话将数据移到GPU上。
if torch.cuda.is_available():
    tensor = tensor.to("cuda")

print(f"Device tensor is stored on: {tensor.device}")

创建张量时候直接将其挪到GPU上有三种写法:

torch.rand(2,3).cuda()

torch.rand(2,3).to("cuda")

torch.rand(2,3, device="cuda")

对tensor输出单行单列的操作:

tensor = torch.rand(3,4)
print(tensor)
print(f"First row: {tensor[0]}") #第一行
print(f"First column: {tensor[:, 0]}") #第一列
print(f"Last column: {tensor[:, -1]}") #最后一列
print(tensor[:, 1]) #第二列

运行结果:
tensor([[0.7533, 0.8648, 0.4569, 0.9276],
        [0.1350, 0.7902, 0.4059, 0.2947],
        [0.0973, 0.2015, 0.9562, 0.8002]])
First row: tensor([0.7533, 0.8648, 0.4569, 0.9276])
First column: tensor([0.7533, 0.1350, 0.0973])
Last column: tensor([0.9276, 0.2947, 0.8002])
tensor([0.8648, 0.7902, 0.2015])

 tensor乘法:

*在pytorch中是对应元素相乘;

import torch
vec = torch.arange(4)
mtx = torch.arange(12).reshape(4,3)
print(vec*vec)
print(mtx*mtx) #这里print(mtx*vec)或者print(vec*mtx)会报错,两个tensor必须在行或者列上保持元素个数的一致

运行结果:
>>
tensor([0, 1, 4, 9])
tensor([[  0,   1,   4],
        [  9,  16,  25],
        [ 36,  49,  64],
        [ 81, 100, 121]])
import torch
vec = torch.arange(4).reshape(4,1) # 增加维度
mtx = torch.arange(12).reshape(4,3)
print(vec*mtx)
print(mtx*vec)

运行结果:
>>
tensor([[ 0,  0,  0],
        [ 3,  4,  5],
        [12, 14, 16],
        [27, 30, 33]])
tensor([[ 0,  0,  0],
        [ 3,  4,  5],
        [12, 14, 16],
        [27, 30, 33]])

 torch.mv(A,B)在pytorch是矩阵相乘,如果A是一个n×m张量,B是一个1×m维张量,将会输出一个n 元 1维张量。实际计算过程中是B×AT,即B×(A的转置);

vec = torch.arange(4)
mtx = torch.arange(12).reshape(3,4)
print(vec)
print(mtx)
print(torch.mv(mtx,vec))

运行结果:
tensor([0, 1, 2, 3])
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]])
tensor([14, 38, 62])

torch.mm(A,B) , 如果A是一个n×m张量,B 是一个 m×p张量,将会输出一个 n×p张量

 torch.dot(A,B),计算两个张量的内积,要求两个张量都为一维向量

import torch
vec = torch.arange(4)
print(torch.dot(vec, vec))

运行结果:
tensor(14)

黑科技@,也是严格按照第一个参数的列数要等于第二个参数的行数 

import torch
vec = torch.arange(4)
mtx = torch.arange(12)
m1 = mtx.reshape(4,3)
m2 = mtx.reshape(3,4)

print(vec @ vec) #vec @ vec==torch.dot(vec,vec)
print(vec @ m1) # 本句直接使用torch.mv()无法执行
print(m2 @ vec) # m2 @ vec==torch.mv(m2,vec)
print(m1 @ m2) # m1 @ m2==torch.mm(m1,m2)

运行结果:
>>
tensor(14)
tensor([42, 48, 54])
tensor([14, 38, 62])
tensor([[ 20,  23,  26,  29],
        [ 56,  68,  80,  92],
        [ 92, 113, 134, 155],
        [128, 158, 188, 218]])

torch.matmul(),matmul不自局限于一二维,可以进行高维张量的乘法 

vec = torch.arange(3)
mtx = torch.arange(12).reshape(3,4)
print(torch.matmul(vec,mtx))
print(torch.matmul(vec,vec))
print(torch.matmul(mtx.T,mtx))
print(torch.matmul(mtx.T,vec))

运行结果:
>>
tensor([20, 23, 26, 29])
tensor(5)
tensor([[ 80,  92, 104, 116],
        [ 92, 107, 122, 137],
        [104, 122, 140, 158],
        [116, 137, 158, 179]])
tensor([20, 23, 26, 29])

tensor.add_(),执行张量的加法运算

tensor = torch.ones(4, 4)
tensor[:,1] = 0
print(tensor, "\n")
tensor.add_(5)
print(tensor)

运行结果:
tensor([[1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.],
        [1., 0., 1., 1.]])

tensor([[6., 5., 6., 6.],
        [6., 5., 6., 6.],
        [6., 5., 6., 6.],
        [6., 5., 6., 6.]])

 

### 回答1: PyTorch中的tensor切片是指从一个tensor中选择特定的元素或子集。切片操作可以通过索引或范围来指定。下面是关于PyTorch tensor切片的一些重要信息: 1.基本切片操作:您可以使用索引操作符[]来对tensor进行切片。例如,如果有一个3x3的tensor,可以使用`tensor[1:3, 0:2]`来获得第二行和第三行的前两列。 2.索引规则:切片操作的索引是从0开始的。在切片时,起始索引是包含在切片中的,而结束索引是不包含在切片中的。例如,`tensor[1:3]`将返回索引为1和2的元素,但不包括索引为3的元素。 3.负数索引:您可以使用负数索引来从后面开始对tensor进行切片。例如,`tensor[-1]`将返回最后一个元素。 4.步长操作:您可以使用步长操作来跳过某些元素进行切片。例如,`tensor[0:3:2]`将返回索引为0和2的元素。 5.高维tensor切片:对于高维tensor,您可以在多个维度上进行切片。例如,`tensor[:, 1]`将返回所有行的第二列。 6.更改切片:切片的结果是原始tensor的视图,并且共享相同的内存。因此,对切片的更改将反映在原始tensor上。 7.使用切片进行赋值:您可以使用切片操作来对tensor的某些元素进行赋值。例如,`tensor[1:3, 0:2] = 0`将第二行和第三行的前两列设置为0。 请注意,这只是关于PyTorch tensor切片的一些基本信息,更复杂的操作如高级索引和掩码索引等也是可行的。 ### 回答2: PyTorch中的tensor切片是指从一个tensor中选择部分元素的操作。通过切片操作,我们可以访问或修改tensor中的特定元素,或者创建一个新的tensor来存储所选元素。 切片操作的基本语法是t[start:stop:step],其中start表示起始位置,stop表示结束位置(但不包括该位置上的元素),step表示步长。 例如,如果有一个1维tensor t = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我们可以使用切片操作来选择其中的一部分元素。 - t[2:6]将返回一个新的tensor,包含元素2, 3, 4, 5; - t[:5]将返回一个新的tensor,包含元素0, 1, 2, 3, 4; - t[5:]将返回一个新的tensor,包含元素5, 6, 7, 8, 9; - t[1:8:2]将返回一个新的tensor,包含元素1, 3, 5, 7。 对于多维tensor,我们可以使用相同的切片操作来选择各个维度上的元素。 例如,如果有一个2维tensor t = [[0, 1, 2], [3, 4, 5], [6, 7, 8]],我们可以使用切片操作来选择其中的一部分元素。 - t[1:3, :2]将返回一个新的tensor,包含元素[[3, 4], [6, 7]],表示选择第1行和第2行的前2列; - t[:, 1]将返回一个新的tensor,包含元素[1, 4, 7],表示选择所有行的第1列。 需要注意的是,切片操作返回的是原始tensor的一个视图,而不是创建一个新的tensor。这意味着对切片后的tensor进行修改,将会影响到原始tensor。如果需要创建一个新的tensor对象,可以使用切片操作的clone()方法来复制原始tensor的数据。 ### 回答3: PyTorch是一个常用的深度学习框架,TensorPyTorch中用于处理数据的基本数据结构。在PyTorch中,我们可以使用Tensor进行切片操作来选择或修改我们需要的元素。 通过索引操作,我们可以对Tensor进行切片。在切片操作中,可以使用逗号分隔的索引列表来选择多个维度的元素。例如,使用tensor[a:b, c:d]的切片操作,可以选择Tensor中从第a行到第b行(不包括b)以及第c列到第d列(不包括d)的元素。 在切片操作中,索引的开始和结束位置都是可选的,如果不指定,则默认为从开头到末尾。此外,还可以使用负数索引来表示从末尾开始的位置。 除了使用切片进行选择之外,我们还可以使用切片进行修改。通过将切片操作放在赋值语句的左侧,我们可以将新的值赋予切片所选择的元素。 值得注意的是,切片操作返回的是原始Tensor的视图,而不是复制。这意味着对切片的修改也会反映在原始Tensor上。 需要注意的是,在PyTorch中进行切片操作不会对Tensor进行内存复制,这样可以减少内存消耗并提高代码的执行效率。 总而言之,PyTorch中的Tensor切片操作允许我们根据需要选择或修改Tensor中的元素。通过索引和切片操作,我们可以根据具体需求灵活操作Tensor的数据。这为我们在深度学习任务中提供了丰富的选择和便利性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值