pytorch拟合函数
生活随笔
收集整理的這篇文章主要介紹了
pytorch拟合函数
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
歡迎訪問我的博客首頁。
pytorch擬合函數(shù)
- 1. 擬合一元一次函數(shù)
- 1.1 自定義網(wǎng)絡(luò)
- 1.2 使用卷積網(wǎng)絡(luò)
- 2. 擬合一個數(shù)
- 2.1 第一種方法
- 2.2 第二種方法
1. 擬合一元一次函數(shù)
??擬合函數(shù)y=a×x+by=a\times x+by=a×x+b,其中a=1,b=2a=1,b=2a=1,b=2。
1.1 自定義網(wǎng)絡(luò)
import torch import numpy as npclass Net:def __init__(self):self.a = torch.rand(1, requires_grad=True)self.b = torch.rand(1, requires_grad=True)self.__parameters = dict(a=self.a, b=self.b)self.___gpu = Falsedef forward(self, inputs):return self.a * inputs + self.bdef parameters(self):for name, param in self.__parameters.items():yield paramif __name__ == '__main__':x = np.linspace(1, 50, 50)y = x + 2x = torch.from_numpy(x.astype(np.float32))y = torch.from_numpy(y.astype(np.float32))net = Net()optimizer = torch.optim.Adam(net.parameters(), lr=0.001, weight_decay=0.0005)loss_op = torch.nn.MSELoss(reduction='sum')for i in range(1, 20001, 1):out = net.forward(x)loss = loss_op(y, out)optimizer.zero_grad()loss.backward()optimizer.step()# 輸出中間過程loss_numpy = loss.cpu().detach().numpy()if i % 1000 == 0:print(i, loss_numpy)if loss_numpy < 0.00001:a = net.a.cpu().detach().numpy()b = net.b.cpu().detach().numpy()print(a, b)exit()
??這種方法定義網(wǎng)絡(luò)時沒有繼承torch.nn.Module,完全自己寫了一個網(wǎng)絡(luò),要顯式調(diào)用Net的forward函數(shù)。損失函數(shù)使用的是L2損失。
1.2 使用卷積網(wǎng)絡(luò)
import torch import numpy as npclass Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()layers = []layers.append(torch.nn.Conv2d(1, 1, kernel_size=1, stride=1, bias=True))self.net = torch.nn.ModuleList(layers)def forward(self, x):return self.net[0](x)if __name__ == '__main__':x = np.linspace(1, 50, 50)y = x + 2 # a = 1, b = 2x = torch.from_numpy(x.astype(np.float32))y = torch.from_numpy(y.astype(np.float32))net = Net()optimizer = torch.optim.Adam(net.parameters(), lr=0.001, weight_decay=0.0005)loss_op = torch.nn.L1Loss(reduce=True, size_average=True)for i in range(20000):x_batch = torch.tensor([x[i % 50]]).reshape(1, 1, 1, 1)y_batch = torch.tensor([y[i % 50]]).reshape(1, 1, 1, 1)out = net(x_batch)loss = loss_op(y_batch, out)optimizer.zero_grad()loss.backward()optimizer.step()# 輸出中間過程loss_numpy = loss.cpu().detach().numpy()if i % 1000 == 0:print('--iterator:', i, 'loss:', loss_numpy)if loss_numpy < 1e-10:breakfor k, v in net.named_parameters():print(k, v.cpu().detach().numpy())
??這種方法使用卷積網(wǎng)絡(luò)擬合。使用L2損失擬合的效果很差,這里使用L1作為損失函數(shù)。原因是L2度量的是誤差的平方,當誤差小于1時,L2度量的誤差數(shù)量級比實際誤差的數(shù)量級成倍減少。本例batch_size=1batch\_size=1batch_size=1,迭代若干次后誤差必定小于1,所以使用L1損失在loss達到指定閾值時收斂得更好。
2. 擬合一個數(shù)
??隨機產(chǎn)生一個0到1的數(shù),計算它與0.5的差的平方,通過梯度把產(chǎn)生的數(shù)調(diào)到0.5。
2.1 第一種方法
import torchif __name__ == '__main__':x = torch.rand(1, requires_grad=True)a = torch.tensor([0.5])optimizer = torch.optim.SGD([x], lr=0.05, weight_decay=0.00003)loss_fn = torch.nn.MSELoss()while True:loss = loss_fn(x, a)if loss < 1e-10:breakoptimizer.zero_grad()loss.backward()print('-- ', x.tolist(), x.grad.tolist())optimizer.step()
??第6行指定優(yōu)化參數(shù)x可以使用任何迭代器,比如元組 ( )、列表 [ ]、集合 { }。還可以使用生成器,如1.1中第12-14行。
2.2 第二種方法
import torchif __name__ == '__main__':x = torch.rand(1, requires_grad=True)a = torch.tensor([0.5])loss_fn = torch.nn.MSELoss()while True:loss = loss_fn(x, a)if loss < 1e-10:breakloss.backward()print('-- ', x.tolist(), x.grad.tolist())x.data = x - 0.6 * x.gradx.grad.data.zero_()
??這種方法沒有使用優(yōu)化器,直接利用梯度修改x的值。
總結(jié)
以上是生活随笔為你收集整理的pytorch拟合函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 「Java工具类」Apache的Bean
- 下一篇: IT行业都能干什么事?为什么要学习IT技