Pytorch学习代码

355 阅读2分钟

# coding=utf-8
from  __future__ import print_function #即使在python2.X,使用print就得像python3.X那样加括号使用
import torch

##################################################################构造张量#################################################################

##没有初始化,值为分配的内存中的值
x = torch.empty(5,3)
print(x)

##随机初始化,0-1的值
x = torch.rand(5,3)
print(x)
x = torch.randn(5)#x的shape是(1,5)
print(x)

##初始化为0,类型long
x = torch.zeros(5,3,dtype=torch.long)
print(x)

##初始化为1,类型为double
x  = x.new_ones(5,3,dtype=torch.double)
print(x)

##直接从数据构造
x = torch.tensor([5.5,3])
print(x)

##基于现有tensor进行构造,重写了类型,使用了相同的尺寸
x = x.new_ones(5,3,dtype=torch.double)
x = torch.randn_like(x,dtype=torch.float)
print(x.size())


##################################################################张量算数运算#################################################################
y = torch.rand(5,3)
print(x+y) #加法1
print(torch.add(x,y)) #加法2
result = torch.empty(5,3) #加法三
torch.add(x,y,out=result)
print(result)
y.add_(x)#加法4,后面的_意味着改变了y
print(y)


##################################################################张量其它运算###################################################

#支持所有numpy风格的索引,此处是输出第一列,所有行
print(y[:,1])

#reshape改变形状
x = torch.randn(4,4)
y = x.view(16)
z = x.view(-1,8) #-1代表是尺寸自动确定
print(x.size(),y.size(),z.size())

#如果张量只有一个元素,使用item获取该元素
x = torch.randn(1)##默认float
print(x)
print(x.type())
print(x.item())

#numpy bridge 在numpy  array和torch tensor之间相互转换

## tensor 转 array,共享了一个存储区域,
a = torch.ones(5)
print(a)
b = a.numpy()
print(b)
a.add_(1)
print(a)
print(b)

##array转tensor
import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
np.add(a,1,out=a)
print(a,b)

##将tensor放在cuda上
if(torch.cuda.is_available()):
    device = torch.device("cuda")
    y = torch.ones_like(x,device=device)#直接在GPU上运算
    x = x.to(device)#直接转换到GPU上
    z = x + y
    print(z)
    print(z.to("cpu",torch.double))



###############################################autograd 计算梯度#########################################################
import torch

x = torch.ones(2,2,requires_grad=True) ##设置为True,默认是false,则开始追踪相关operation,完成运算之后调用.backward(),则梯度将自动运算,运算结果保存在.grad属性
print(x)

y = x + 2 #y是一个operation,每个operation都有一个.grad_fn代表一个创建tensor的函数,只有当相关tensor的requires_grad为True时才会被赋值
print(y.grad_fn)

z = y*y*3
out = z.mean()
print(z,out)

#对于标量输出,才可以用backward
out.backward()
print(x.grad)

## vector-Jacobian product,对于向量输出,在使用backward时,需要指定各分量权重向量
x = torch.randn(3,requires_grad=True)
y = x*2
while y.data.norm() < 1000:
    y = y * 2
v = torch.tensor([0.1,1.0,0.001],dtype=torch.float32)
y.backward(v)
print(x.grad)

## 停止使用autograd
print(x.requires_grad)
print((x**2).requires_grad)

with torch.no_grad():
    print((x ** 2).requires_grad)