Pytorch入门(一)基础操作

练习链接:https://github.com/zergtant/pytorch-handbook
生成数据:

import torch
x = torch.rand(5,3) #rand随机生成0-1之间的数
print(x)

#torch.* 用于创建特殊形式的 tensor,包括 torch.ones()、torch.zeros()等;
#torch.*_like() 用于创建一个与已知 tensor 形状相同的 tensor;
#torch.new_* 用于创建一个与已知 tensor 类型相同的 tensor

x = torch.zeros(5,3,dtype=torch.long) #生成全0的tensor,类型为long
print(x)

y = x.new_ones(5,3)#全1,y的类型与x类型相同,为long
print(y)

y = torch.randn_like(x, dtype=torch.float) #生成形状与x相同的即5*3的tensor,randn是服从标准正态分布的随机数
print(y,x.size(),y.size())

x = torch.tensor([5,3])#根据已知生成 
print(x)

数据处理:

  1. (加法)
x = torch.rand(5,3) 
y = torch.rand(5,3) 
#第一种加法
print(x+y)

#第二种加法
print(torch.add(x,y))

#第二种加法可以用result来获取到结果
result = torch.empty(5,3)
torch.add(x,y, out=result)
print(result)

#第三种加法
#任何 以``_`` 结尾的操作都会用结果替换原变量. 例如: ``x.copy_(y)``, ``x.t_()``, 都会改变 ``x``.
y.add_(x)  #等价于y=y+x
print(y)
  1. 其他操作
#查看形状
x = torch.rand(5,3)
print(x.size())
print(x.shape)

#改变形状
x = torch.randn(4,4)
y = x.view(16)
z = x.view(-1,8)  #-1从其他维度推断
print(x.shape, y.shape, z.shape)

#numpy和tensor转化
#tensor->numpy
a = torch.ones(5) #a是tensor
b = a.numpy() #b是numpy  
print(a, b)

#numpy->tensor
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a) 
print(a,b)
#Tensor和numpy对象共享内存,所以他们之间的转换很快,而且几乎不会消耗什么资源。
#但这也意味着,如果其中一个变了,另外一个也会随之改变。

#x.item()
x = torch.randn(1)
print(x)
print(x.item()) #如果你有只有一个元素的张量,使用.item()来得到Python数据类型的数值

#GPU中运行
if torch.cuda.is_available(): #判断是否可以用GPU
    device = torch.device('cuda')
    y = torch.ones_like(x,device=device) #直接从GPU创建张量
    x = x.to(device) #将张量移动到GPU内
    z = x+y
    print(z.to('cpu',torch.double)) #也可以用.to对变量移动到其他设备中
else:
    print("GPU不可用")

#梯度
import torch
x = torch.ones(3,requires_grad=True)
y = x*2
print(y.grad_fn) #grad_fn记录变量是怎么来得  grad_fn=<MulBackward0>
z = x * x + 2 * y
# gradients = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
out = z.mean() #将z变成一个纯量,也可以用sum
out.backward() #计算梯度时,out必须是一个纯量(scalar)
# z.backward(gradients)   #如果不是纯量,可以将一个相等shape的张量作为参数 out.backward() 等于out.backward(torch.tensor(1))
print(x.grad)

#计算梯度
a = torch.rand(2,2)
a = ((a*3)/(a-1))
print(a.requires_grad)
a.requires_grad_(True) #设置为TRUE
print(a.requires_grad)
b = (a*a).sum()
print(b.grad_fn)
#如果不用计算梯度,可以将变量包裹在 with torch.no_grad()中
print(x.requires_grad)
print((x**2).requires_grad)
with torch.no_grad():
    print((x**2).requires_grad)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值