优化器理解:
通过梯度下降来更新神经网络中参数的值,使实际值慢慢的向要求值靠近。但是优化器有很多种,因为只是入门,所以我先不仔细了解各种优化器中要求的算法
可以观察官方文档中的示例:
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 SummaryWriter
dataset = 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 = 0
for 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_loss
print(running_loss)
输出:
tensor(18688.1523, grad_fn=<AddBackward0>)
tensor(16161.1523, grad_fn=<AddBackward0>)
tensor(15446.3174, grad_fn=<AddBackward0>)
...
可以看出我们的差值在不断减小。