视频链接:《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibili
本次作业是测试不同的优化器的算法效果,我这里只测试了四种。
由于这里的数据集太少,所以图像显示的结果可能与实际生活中的数据集的测试效果有差,等到后面我再用大的数据集测试一下。
看代码吧
# 不同的优化器的结果对比
import numpy as np
import torch
import matplotlib.pyplot as plt
# 准备数据集
x_data = torch.Tensor([[1.0], [2.0], [3.0]]) # 二阶张量[3,1]
y_data = torch.Tensor([[2.0], [4.0], [6.0]]) # [3,1]
# 设计模型类
class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
self.linear = torch.nn.Linear(1, 1)
def forward(self, x):
y_pred = self.linear(x)
return y_pred
# 生成四个模型对象
models = []
for i in range(5):
model = LinearModel()
models.append(model)
# 损失和优化器
criterion = torch.nn.MSELoss(size_average=False)
# 优化器字典,我这里只用了四种优化器
optimizer_list = {}
SGD = torch.optim.SGD(models[0].parameters(), lr=0.01)
Adagrad = torch.optim.Adagrad(models[1].parameters(), lr=0.01)
Adam = torch.optim.Adam(models[2].parameters(), lr=0.01)
ASGD = torch.optim.ASGD(models[3].parameters(), lr=0.01)
Adamax = torch.optim.Adamax(models[4].parameters(), lr=0.01)
optimizer_list['SGD'] = SGD
optimizer_list['Adagrad'] = Adagrad
optimizer_list['Adam'] = Adam
optimizer_list['ASGD'] = ASGD
optimizer_list['Adamax'] = Adamax
# 训练周期
loss_dict = {}
# 不同的优化器
for idx, (name, optimizer) in enumerate(optimizer_list.items()):
list = [] # 暂时存入每个优化器的损失值
print(name)
for epoch in range(1000):
# 正向
y_pred = models[idx](x_data) # 调用对应的模型
loss = criterion(y_pred, y_data)
# 将对应的优化器的损失存入列表中
list.append(loss.item())
print(epoch, loss.item())
# 反向
loss.backward()
# 更新
optimizer.step()
optimizer.zero_grad()
# 训练周期结束后
loss_dict[name] = list
print('*' * 50)
# 画图
for name, loss_list in loss_dict.items():
plt.plot(np.arange(1000), loss_list, label=name)
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(loc='best')
plt.show()
结果如下图:
如有错误或疑问请指出,本人也是学生,刚入门,谢谢