pytorch代码示例笔记 -- Autograd
程序员文章站
2022-08-17 22:02:32
这篇博文是我记录学习pytorch的一些代码例子,我会时不时来看这些代码加深学习例子来自https://pytorch.org/tutorials/beginner/pytorch_with_examples.htmlimport torchimport mathdtype = torch.floatdevice = torch.device("cpu")x = torch.linspace(-math.pi, math.pi, 2000, dt...
这篇博文是我记录学习pytorch的一些代码例子,我会时不时来看这些代码加深学习
例子来自https://pytorch.org/tutorials/beginner/pytorch_with_examples.html
实现结果都相同,只是写法不同。
使用Tensors
import torch
import math
dtype = torch.float
device = torch.device("cpu")
x = torch.linspace(-math.pi, math.pi, 2000,
dtype=dtype, device=device)
y = torch.sin(x)
a = torch.randn((), device=device, dtype=dtype, requires_grad=True)
b = torch.randn((), device=device, dtype=dtype, requires_grad=True)
c = torch.randn((), device=device, dtype=dtype, requires_grad=True)
d = torch.randn((), device=device, dtype=dtype, requires_grad=True)
learning_rate = 1e-6
for t in range(2000):
y_pred = a + b * x + c * x ** 2 + d * x ** 3 #y预测
loss = (y_pred - y).pow(2).sum() #平方误差
if t % 100 == 99:
print(t, loss.item())
loss.backward()
with torch.no_grad():
a -= learning_rate * a.grad
b -= learning_rate * b.grad
c -= learning_rate * c.grad
d -= learning_rate * d.grad
a.grad = None
b.grad = None
c.grad = None
d.grad = None
print(f'Result: y = {a.item()} + {b.item()} x + {c.item()} x^2 + {d.item()} x ^ 3')
定义新的自动梯度函数
import torch
import math
class LegendrePolynomial3(torch.autograd.Function):
@staticmethod
def forward(ctx, input):
ctx.save_for_backward(input)
return 0.5 * (5 * input ** 3 - 3 * input)
@staticmethod
def backward(ctx, grad_output):
input, = ctx.saved_tensors
return grad_output * 1.5 * (5 * input ** 2 - 1)
dtype = torch.float
device = torch.device("cpu")
x = torch.linspace(-math.pi, math.pi, 2000, device=device, dtype=dtype)
y = torch.sin(x)
a = torch.full((), 0.0, device=device,
dtype=dtype, requires_grad=True)
b = torch.full((), -1.0, device=device,
dtype=dtype, requires_grad=True)
c = torch.full((), 0.0, device=device,
dtype=dtype, requires_grad=True)
d = torch.full((), 0.3, device=device,
dtype=dtype, requires_grad=True)
learning_rate = 1e-6
for t in range(2000):
P3 = LegendrePolynomial3.apply
y_pred = a + b * P3(c + d * x)
loss = (y_pred - y).pow(2).sum()
if t % 100 == 99:
print(t, loss.item())
loss.backward()
with torch.no_grad():
a -= learning_rate * a.grad
b -= learning_rate * b.grad
c -= learning_rate * c.grad
d -= learning_rate * d.grad
a.grad = None
b.grad = None
c.grad = None
d.grad = None
print(f'Result: y = {a.item()} + {b.item()} * P3{c.item()} + {d.item()} x)')
使用optim
import torch
import math
x = torch.linspace(-math.pi, math.pi, 2000)
y = torch.sin(x)
p = torch.tensor([1, 2, 3])
xx = x.unsqueeze(-1).pow(p)
model = torch.nn.Sequential(
torch.nn.Linear(3, 1),
torch.nn.Flatten(0, 1)
)
loss_fn = torch.nn.MSELoss(reduction='sum')
learning_rate = 1e-3
optimizer = torch.optim.RMSprop(model.parameters(), lr=learning_rate)
for t in range(2000):
y_pred = model(xx)
loss = loss_fn(y_pred, y)
if t % 100 == 99:
print(t, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
linear_layer = model[0]
print(f'Result: y = {linear_layer.bias.item()} + {linear_layer.weight[:, 0].item()} x + \
{linear_layer.weight[:, 1].item()} x ^ 2 + {linear_layer.weight[:, 2].item()} x ^ 3')
PyTorch: Custom nn Modules
import torch
import math
class Polynomial3(torch.nn.Module):
def __init__(self):
super().__init__()
self.a = torch.nn.Parameter(torch.randn(()))
self.b = torch.nn.Parameter(torch.randn(()))
self.c = torch.nn.Parameter(torch.randn(()))
self.d = torch.nn.Parameter(torch.randn(()))
def forward(self, x):
return self.a + self.b * x + self.c * x ** 2 + self.d * x ** 3
def string(self):
return f'y = {self.a.item()} + {self.b.item()} x + \
{self.c.item()} x ** 2 + {self.d.item()} x ** 3'
x = torch.linspace(-math.pi, math.pi, 2000)
y = torch.sin(x)
model = Polynomial3()
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=1e-6)
for t in range(2000):
y_pred = model(x)
loss = criterion(y_pred, y)
if t % 100 == 99:
print(t, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'Result: {model.string()}')
PyTorch: Control Flow + Weight Sharing
import torch
import math
import random
class DynamicNet(torch.nn.Module):
def __init__(self):
super().__init__()
self.a = torch.nn.Parameter(torch.randn(()))
self.b = torch.nn.Parameter(torch.randn(()))
self.c = torch.nn.Parameter(torch.randn(()))
self.d = torch.nn.Parameter(torch.randn(()))
self.e = torch.nn.Parameter(torch.randn(()))
def forward(self, x):
y = self.a + self.b * x + self.c * x ** 2 + self.d * x ** 3
for exp in range(4, random.randint(4, 6)):
y = y + self.e * x ** exp
return y
def string(self):
return f'y = {self.a.item()} + {self.b.item()} x + \
{self.c.item()} x ** 2 + {self.d.item()} x ** 3 + \
{self.e.item()} x ** 4 ? + {self.e.item()} x ** 5?'
x = torch.linspace(-math.pi, math.pi, 2000)
y = torch.sin(x)
model = DynamicNet()
criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=1e-8, momentum=0.9)
for t in range(30000):
y_pred = model(x)
loss = criterion(y_pred, y)
if t % 2000 == 1999:
print(t, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'Result: {model.string()}')
本文地址:https://blog.csdn.net/jcl314159/article/details/111940552
上一篇: Android实现滑块拼图验证码功能
下一篇: Android中切换到主线程执行的方法
推荐阅读
-
Java语言Consistent Hash算法学习笔记(代码示例)
-
Android学习笔记--使用剪切板在Activity中传值示例代码
-
Android学习笔记--通过Application传递数据代码示例
-
Android学习笔记--Activity中使用Intent传值示例代码
-
flask从入门到精通详细笔记,文末附带视频教程和示例代码
-
pytorch代码示例笔记 -- Autograd
-
pytorch学习笔记十四:自动微分机制(backward、torch.autograd.grad)
-
Stacked Hourglass Network(ECCV'16) 论文笔记+pytorch代码阅读
-
Angular6笔记之封装http的示例代码
-
超详细PyTorch实现手写数字识别器的示例代码