作者:暗夜风线_371 | 来源:互联网 | 2023-06-23 15:08
优化器理解:
通过梯度下降来更新神经网络中参数的值,使实际值慢慢的向要求值靠近。但是优化器有很多种,因为只是入门,所以我先不仔细了解各种优化器中要求的算法
可以观察官方文档中的示例:
for input, target in dataset:optimizer.zero_grad()output = model(input)loss = loss_fn(output, target)loss.backward()optimizer.step()
理解与解释:从dataset这个数据集中依次拿出一个数据input,然后我们先将优化器清零,因为如果不清零,上一次循环中原有的值还在,会影响这次循环的优化,然后我们将input放入我们搭建的模型model中,然后利用损失函数来计算差值,利用反向传播来计算我们应该更新的值的大小,然后利用优化器的step()函数来进行一个更新。一般来说,我们会进行很多次这样的优化,来使实际值趋于我们需要的值,所以可以在上方再加一重循环。
对于各种优化器其中的算法,入门的我先不做了解,可以看下官方文档
代码呈现优化器过程
import torch
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, CrossEntropyLoss
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriterdataset = torchvision.datasets.CIFAR10("dataset2",train=False,transform=torchvision.transforms.ToTensor())
dataloader = DataLoader(dataset,batch_size=1)class Test(nn.Module):def __init__(self):super(Test, self).__init__()self.conv1 = Conv2d(3,32,5,padding=2)self.maxpool1 = MaxPool2d(kernel_size=2)self.conv2 = Conv2d(32,32,5,padding=2)self.maxpool2 = MaxPool2d(2)self.conv3 = Conv2d(32,64,5,padding=2)self.maxpool3 = MaxPool2d(kernel_size=2)self.flatten = Flatten()self.linear1 = Linear(1024,64)self.linear2 = Linear(64,10)def forward(self,x):x = self.conv1(x)x = self.maxpool1(x)x = self.conv2(x)x = self.maxpool2(x)x = self.conv3(x)x = self.maxpool3(x)x = self.flatten(x)x = self.linear1(x)x = self.linear2(x)return x;test = Test()
loss = CrossEntropyLoss()
optim = torch.optim.SGD(test.parameters(),lr=0.01)
for epoch in range(20):running_loss = 0for data in dataloader:imgs,target = data;optim.zero_grad()output = test(imgs)result_loss = loss(output,target)result_loss.backward()optim.step()running_loss+=result_lossprint(running_loss)
输出:
tensor(18688.1523, grad_fn&#61;<AddBackward0>)
tensor(16161.1523, grad_fn&#61;<AddBackward0>)
tensor(15446.3174, grad_fn&#61;<AddBackward0>)
...
可以看出我们的差值在不断减小。