PyTorch 학습 : 2 개, Autograd (자동 파생)

1. Autograd : 자동 미분

PyTorch의 모든 신경망의 핵심은 autograd패키지입니다. 먼저이 패키지를 간략하게 소개 한 다음 첫 번째 신경망을 훈련 시키겠습니다.

autograd이 패키지는 텐서의 모든 작업에 대해 자동 차별화를 제공합니다. 런타임에 정의 된 프레임 워크로, 코드 실행 방식에 따라 역 전파가 정의되며 각 반복이 다를 수 있습니다.

다음으로이 패키지를보기 위해 몇 가지 간단한 예제를 사용합니다.

텐서

torch.Tensor패키지의 핵심 클래스입니다. 속성 .requires_grad을 True로 설정하면 모든 작업을 추적하기 시작합니다. 계산이 완료되면 .backward()모든 그라디언트를 호출 하여 자동으로 계산할 수 있습니다 . 이 텐서의 기울기는 .grad속성에 누적됩니다 .

텐서가 기록을 추적하지 못하도록하려면을 호출 .detach()하여 계산 기록에서 분리하고 향후 계산이 추적되지 않도록 할 수 있습니다.

추적 기록 (및 메모리 사용)을 방지하기 위해 torch.no_grad ()를 사용하여 코드 블록을 래핑 할 수도 있습니다. 모델에 requires_grad = True학습 가능한 매개 변수 가있을 수 있지만 그래디언트가 필요하지 않기 때문에 모델을 평가할 때 특히 유용 할 수 있습니다 .

autograd implementation-Function에 매우 중요한 또 다른 클래스가 있습니다.

Tensor와 Function은 서로 연결되어 비순환 그래프를 구성하여 완전한 계산 프로세스를 구성합니다. 각 텐서는 보유 .grad_fn(사용자가 의해 생성 텐서 제외 생성 텐서의 기능을 의미 속성 grad_fn됩니다 None).

미분을 계산하려면 Tensor에서 호출 할 수 있습니다 .backward(). Tensor가 스칼라 (즉, 하나의 요소 데이터가 포함됨) 인 backward()경우 매개 변수 지정할 필요가 없지만 더 많은 요소가있는 경우 일치하는 모양의 텐서 인 그라디언트 매개 변수를 지정해야합니다.

import torch

텐서를 만들고 requires_grad = True계산을 추적하도록 설정

x = torch.ones(2, 2, requires_grad=True)
print(x)

输出:

tensor([[1., 1.],
        [1., 1.]], requires_grad=True)

 

텐서에 대한 작업을 수행합니다.

y = x + 2
print(y)

输出:

tensor([[3., 3.],
        [3., 3.]], grad_fn=<AddBackward0>)

y는 작업에 의해 생성되므로 grad_fn이 있고 x는 사용자가 생성하므로 grad_fn은 None입니다.

print(y.grad_fn)
print(x.grad_fn)

输出:

<AddBackward0 object at 0x000001E020B794A8>
None

y에서 작업 수행

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

print(z, out)

输出:

tensor([[27., 27.],
        [27., 27.]], grad_fn=<MulBackward0>) tensor(27., grad_fn=<MeanBackward1>)

.requires_grad_(...)기존 Tensor의 requires_grad로고를 제자리에서 변경합니다 . 지정하지 않으면 입력 플래그의 기본값은 False입니다.

a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)
b = (a * a).sum()
print(b.grad_fn)

输出:

False
True
<SumBackward0 object at 0x000001E020B79FD0>

그라디언트

지금의이 수행 할 수 다시 전파, out.backward()실행하는 것과 동일out.backward(torch.tensor(1.))

out.backward()

out의 기울기 d (out) / dx를 x로 출력합니다.

print(x.grad)

输出:

tensor([[4.5000, 4.5000],
        [4.5000, 4.5000]])

이제 야 코비 벡터 곱의 예를 살펴 보겠습니다.

x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:
    y = y * 2
print(y)

输出:

tensor([  384.5854,   -13.6405, -1049.2870], grad_fn=<MulBackward0>)

이제이 경우 y는 더 이상 스칼라가 아닙니다. torch.autograd완전한 야 코비 행렬식을 직접 계산할 수는 없지만 야 코비 벡터 곱만 원할 경우 벡터를 매개 변수로 뒤로 전달하기 만하면됩니다.

v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad)

输出:

tensor([5.1200e+01, 5.1200e+02, 5.1200e-02])

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

 

추천

출처blog.csdn.net/qq_40716944/article/details/107790345