Tensor基本操作

本文介绍了PyTorch中Tensor的基本操作,包括与Numpy的转换。内容涉及Tensor的矩阵加法和广播机制,以及如何将Tensor移到GPU上进行计算,强调了Tensor与Numpy共享内存的特性。
#创建并初始化一个随机的tensor 
x=torch.rand(5,3)
print(x)
tensor([[0.2764, 0.5943, 0.1787],
        [0.5097, 0.2853, 0.3463],
        [0.9110, 0.6389, 0.2536],
        [0.9433, 0.6114, 0.0199],
        [0.7834, 0.0757, 0.1763]])
# 创建一个全零型的tensor 
x=torch.zeros(5,3,dtype=torch.long)
print(x)
tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
# 根据数据进行创建
x=torch.tensor([5.5,3])
print(x)
tensor([5.5000, 3.0000])
#自定义tensor的数据类型
x=x.new_ones(5,3,dtype=torch.float64)
print(x)

x=torch.randn_like(x,dtype=torch.float)# 指定新的数据类型
print(x)

print(x.size())
print(x.shape)   #通过shape size()获得tensor形状
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)
tensor([[-1.3076, -1.8436, -1.1117],
        [-0.3132,  0.8285,  0.6187],
        [ 0.0623, -0.6991, -1.2316],
        [ 0.8319, -0.3928, -0.5250],
        [ 0.0562,  0.7673,  0.1927]])
torch.Size([5, 3])
torch.Size([5, 3])
# 算术操作 + - * / 以加法为例
y=torch.rand(5,3)
print(x+y)

print(torch.add(x,y))

result=torch.empty(5,3)   #指定输出 数据预处理时常用
torch.add(x,y,out=result)
print(result)   
tensor([[-0.7371, -1.0647, -1.0779],
        [ 0.1557,  1.8013,  1.0695],
        [ 0.8420, -0.1259, -0.5630],
        [ 1.5255, -0.3072, -0.3871],
        [ 0.8199,  1.2415,  0.6198]])
tensor([[-0.7371, -1.0647, -1.0779],
        [ 0.1557,  1.8013,  1.0695],
        [ 0.8420, -0.1259, -0.5630],
        [ 1.5255, -0.3072, -0.3871],
        [ 0.8199,  1.2415,  0.6198]])
tensor([[-0.7371, -1.0647, -1.0779],
        [ 0.1557,  1.8013,  1.0695],
        [ 0.8420, -0.1259, -0.5630],
        [ 1.5255, -0.3072, -0.3871],
        [ 0.8199,  1.2415,  0.6198]])
# 索引 索引出来的结果与原数据共享内存,即修改一个另外一个也跟着修改
print(x)
y=x[0,:]
y+=1
print(y)
print(x[0,:])
tensor([[ 0.6924,  0.1564,  0.8883],
        [-0.3132,  0.8285,  0.6187],
        [ 0.0623, -0.6991, -1.2316],
        [ 0.8319, -0.3928, -0.5250],
        [ 0.0562,  0.7673,  0.1927]])
tensor([1.6924, 1.1564, 1.8883])
tensor([1.6924, 1.1564, 1.8883])
# 改变形状  用view()来改变tensor 的形状
y=x.view(15)
z=x.view(-1,5) #-1 所指的维度可以根据其他维度的值推出来
print(x.size(),y.size(),z.size())
torch.Size([5, 3]) torch.Size([15]) torch.Size([3, 5])
# 广播机制 
# 当对两个不同形状的Tensor 按元素运算时,可能会触发广播机制:
# 即:先复制元素使得这两个Tensor的形状相同,再按元素运算
x=torch.arange(1,3).view(1,2)
print(x)
y=torch.arange(1,4).view(3,1)
print(y)
print(x+y)
tensor([[1, 2]])
tensor([[1],
        [2],
        [3]])
tensor([[2, 3],
        [3, 4],
        [4, 5]])

由于x和y分别是1行2列和3行1列的矩阵,如果要计算x+y,那么x中的第一行的2个元素被广播(复制)到了第二行,第三行,y同理

Tensor 与 Numpy 转换

# tensor 转 numpy   利用numpy()
a=torch.ones(5)
b=a.numpy()
print(a,b)
a+=1
print(a,b)

b+=1
print(a,b)
tensor([1., 1., 1., 1., 1.]) [1. 1. 1. 1. 1.]
tensor([2., 2., 2., 2., 2.]) [2. 2. 2. 2. 2.]
tensor([3., 3., 3., 3., 3.]) [3. 3. 3. 3. 3.]

由上述结果可见tensor与numpy 是共享内存的,一个改变另外一个也跟着改变

# numpy 转 tensor  利用from_numpy()
import numpy as np
a=np.ones(5)
b=torch.from_numpy(a)
print(a,b)
a+=1
print(a,b)
b+=1
print(a,b)


[1. 1. 1. 1. 1.] tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
[2. 2. 2. 2. 2.] tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
[3. 3. 3. 3. 3.] tensor([3., 3., 3., 3., 3.], dtype=torch.float64)

TENSOR ON GPU

# 用to()可以将Tensor 在CPU和GPU(硬件支持)之间相互移动
if torch.cuda.is_available():
    device=torch.device("cuda")
    y=torch.ones_like(x,device=device)#直接创建一个GPU上的Tensor
    x=x.to(device)
    z=x+y
    print(z)
    print(z.to("CPU",torch.double))

参考动手学深度学习with pytorch

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值