pytorch官方教程笔记--01基本概念与自动微分

基础1

入门

pytorch基础概念,类似于numpy的ndarrays,好处是可以使用GPU进行计算

构造矩阵的不同方式:

from __future__ import print_function
import torch
x=torch.empty(5,3)
print(x)
x=torch.rand(5,3)
print(x)
x=torch.zeros(5,3,dtype=torch.long)
print(x)
x=torch.tensor([5.56,5,3],dtype=float)
print(x)


基于已存在的tensor创建新的tensor:

#new_* 可以使用相同size
x=x.new_ones(5,3)
print(x)

x=torch.randn_like(x)
#randn_like和rand都在torch中
print(x)

输出:

tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)
tensor([[ 1.6836,  0.0524,  0.3643],
        [-0.7232, -0.2245,  0.1752],
        [ 0.5527,  0.0971, -1.6321],
        [ 2.0045,  0.6326,  0.0187],
        [ 1.3622,  0.3409, -1.5892]], dtype=torch.float64)


tensor几种加法形式:

#torch.Size是一个元组,所以它支持所有的元组操作
#tensor几种加法形式
y=torch.rand(5,3)
print(x+y)
print(torch.add(x,y))
print(x.add_(y))
#任何使张量会发生变化的操作都有一个前缀 '_',如
#x.copy_y()
#x.t_()

用view()改变tensor大小:

#torch.Size是一个元组,所以它支持所有的元组操作
x=torch.randn(3,5)
y=x.view(1,15)
z=y.view(-1,3)
print(x.size(),y.size(),z.size())
#一个tensor中只有元素使可用.item()获得value
x=torch.rand(1)
print(x.item())

自动微分

Tensor

torch.Tensor 是包的核心类。如果将其属性 .requires_grad 设置为 True,则会开始跟踪针对 tensor 的所有操作。完成计算后,您可以调用 .backward() 来自动计算所有梯度。该张量的梯度将累积到 .grad 属性中。
要停止 tensor 历史记录的跟踪,您可以调用 .detach(),它将其与计算历史记录分离,并防止将来的计算被跟踪。要停止跟踪历史记录(和使用内存),您还可以将代码块使用 with torch.no_grad(): 包装起来。在评估模型时,这是特别有用的,因为模型在训练阶段具有 requires_grad = True 的可训练参数有利于调参,但在评估阶段我们不需要梯度。
还有一个类对于 autograd 实现非常重要那就是 Function。Tensor 和 Function 互相连接并构建一个非循环图,它保存整个完整的计算过程的历史信息。每个张量都有一个 .grad_fn 属性保存着创建了张量的 Function 的引用,(如果用户自己创建张量,则grad_fn 是 None )。
如果你想计算导数,你可以调用 Tensor.backward()。如果 Tensor 是标量(即它包含一个元素数据),则不需要指定任何参数backward(),但是如果它有更多元素,则需要指定一个gradient 参数来指定张量的形状。


反向传播自动求导例子:

import torch
x=torch.ones(2,2,requires_grad=True)
y=x+2
print(y)
print(y.grad_fn)
z=y*y*3
out=z.mean()
print(z,out)
#我们现在后向传播,因为输出包含了一个标量,out.backward() 等同于out.backward(torch.tensor(1.))
out.backward()
print(x.grad)


requires_grad标记的默认与更改:

#.requires_grad_( ... ) 会改变张量的 requires_grad 标记,
#输入的标记默认为 False ,如果没有提供相应的参数。
a=torch.randn(2,2)
a=((a*3)/(a-1))
print(a.requires_grad)
a.requires_grad_(True)
b=a*a
print(b.requires_grad)


雅各比向量积例子:

x=torch.randn(3,requires_grad=True)
y=x*2
while y.data.norm()<1000:
    y=y*2
print(y)
#此时y不再是标量,torch.aotograd不能直接计算整个雅各比,但如果只需要
#雅各比向量积,只需简单的传递向量给backward作为参数
v=torch.tensor([0.1,1,0.0001])
y.backward(v)
print(x.grad)


你可以通过将代码包裹在 with torch.no_grad(),来停止对从跟踪历史中 的 .requires_grad=True 的张量自动求导:

print(x.requires_grad)
print((x**2).requires_grad)

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

输出:

True
True
False

参考:
1.http://www.pytorch123.com/

你可能感兴趣的:(pytorch学习,python,深度学习,人工智能)