头歌之动手学人工智能-Pytorch 之优化

article/2025/7/22 8:23:32

目录

第1关:如何使用optimizer

任务描述

编程要求

测试说明

真正的科学家应当是个幻想家;谁不是幻想家,谁就只能把自己称为实践家。 —— 巴尔扎克开始你的任务吧,祝你成功!

第2关:optim.SGD

任务描述

编程要求

测试说明

真正的科学家应当是个幻想家;谁不是幻想家,谁就只能把自己称为实践家。 —— 巴尔扎克开始你的任务吧,祝你成功!

第3关:RMSprop

任务描述

编程要求

测试说明

真正的科学家应当是个幻想家;谁不是幻想家,谁就只能把自己称为实践家。 —— 巴尔扎克开始你的任务吧,祝你成功!

第4关:Adam

任务描述

编程要求

测试说明

知识有如人体血液一样的宝贵。人缺少了血液,身体就要衰弱,人缺少了知识,头脑就要枯竭。——高士其开始你的任务吧,祝你成功!

第5关:优化器总结

任务描述

编程要求

测试说明

开始你的任务吧,祝你成功!


第1关:如何使用optimizer

torch.optim是一个实现了各种优化算法的库。大部分常用的方法得到支持,并且接口具备足够的通用性,使得未来能够集成更加复杂的方法。

  • 任务描述

本关任务:

本关卡要求同学们声明一个 SGD 优化器 optimizer,按照要求传入优化器的参数。同时,为了便于观察,利用optimizer.param_groups方法查看优化器的各项参数并输出。

  • 编程要求

本关涉及的代码文件为optimizer.py,本次编程任务是补全右侧代码片段中Begin至End中间的代码。其中,本关声明了一个线性模型  linear,将该模型的相关参数进行操作,具体要求如下:

声明一个 SGD 优化器 optimizer,将 linear 的参数作为优化器的参数传入其中,其学习率lr设为0.1;
利用optimizer.param_groups即可查看优化器的各项参数并输出lr的值。
具体请参见后续测试样例。

  • 测试说明

测试过程:

本关涉及的测试文件为optimizerTest.py,运行用户填写后的程序判断正误。
根据程序是否包含创建正则化的关键语句来判断程序是否正确,如是否含有optimizer.param_groups、optim.SGD等语句。
若正确则输出下面的预期输出,否则报错,打印 Sorry ! Check again please!。
以下是测试样例:

测试输入:
预期输出:
lr: 0.1

Congratulation!

真正的科学家应当是个幻想家;谁不是幻想家,谁就只能把自己称为实践家。 —— 巴尔扎克
开始你的任务吧,祝你成功!
import torch.nn as nn
import torch.optim
import torch
from torch.autograd import Variable# Linear Regression Model
class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear = nn.Linear(2, 2)  # input and output is 2 dimensiondef forward(self, x):out = self.linear(x)return out
model = LinearRegression()#/********** Begin *********/#声明一个 SGD优化器 optimizer,传入参数#利用optimizer.param_groups查看优化器的各项参数并输出lr的值。#/********** End *********/

第2关:optim.SGD

  • 任务描述

本关任务:

本次关卡要求同学们声明一个 SGD优化器 optimizer, 掌握为不同的子网络参数设置不同的学习率,并按照相关格式要求输出相应语句。

  • 编程要求

本关涉及的代码文件为 SGDoptimizer.py,本次编程任务是补全右侧代码片段中Begin至End中间的代码,其中,程序提前声明了一个线性模型为model,按照要求利用该模型完成实验,具体要求如下:

声明一个 SGD优化器 optimizer, 其中,模型model中的linear层学习率为默认值1e-5,linear2层的学习率为0.01;

按照“The len of param_groups list:...”格式输出 optimizer.param _groups的长度;

按照“linear's lr:...”格式输出linear层的lr;

按照“linear2's lr:...”格式输出linear2层的lr;

具体请参见后续测试样例。

  • 测试说明

测试过程:

本关涉及的测试文件为SGDoptimizerTest.py,运行用户填写后的程序判断正误。

根据程序是否包含创建正则化的关键语句来判断程序是否正确,如是否含有optim.SGD,len(),optimizer.param_groups等语句。

若正确则输出下面的预期输出,否则报错,打印 Sorry ! Check again please!。
注意,在声明变量时请按照提示命名,否则将会报错。
以下是测试样例:

测试输入:
预期输出:
The len of param_groups list: 2
linear's lr: 1e-05
linear2's lr: 0.01


Congratulation!

真正的科学家应当是个幻想家;谁不是幻想家,谁就只能把自己称为实践家。 —— 巴尔扎克
开始你的任务吧,祝你成功!
import torch.nn as nn
import torch.optim
import torch
from torch.autograd import Variable# Linear Regression Model
class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear = nn.Linear(2, 2)  # input and output is 1 dimensionself.linear2 = nn.Linear(2, 2)def forward(self, x):out = self.linear(x)out = self.linear2(out)return out
model = LinearRegression()#/********** Begin *********/#声明一个 SGD优化器 optimizer, 按要求设置 lr 的值
optimizer = torch.optim.SGD([{'params': model.linear.parameters(), 'lr': 1e-5},{'params':model.linear2.parameters()}], lr=0.01, momentum=0.9)
#按照格式输出optimizer.param_groups的长度
print('The len of param_groups list:',len(optimizer.param_groups))
#按照格式输出linear层的lr
print("linear's lr:",optimizer.param_groups[0]['lr'])
#按照格式输出linear2层的lr
print("linear2's lr:",optimizer.param_groups[1]['lr'])#/********** End *********/

第3关:RMSprop

  • 任务描述

本关任务:

本关要求同学们声明一个 RMSprop优化器optimizer,设置其lr和alpha的数值。并补充优化器基本使用方法的相关步骤:清空梯度和更新参数。最后,按照格式输出相关信息。

  • 编程要求

本关涉及的代码文件为RMSprop.py,本次编程任务是补全右侧代码片段中Begin至End中间的代码。其中,程序提前声明了一个线性模型为model,和训练数据x_train、y_train,按照要求利用这些信息完成实验,具体要求如下:

声明一个 RMSprop优化器optimizer,设置 lr为0.1,alpha为 0.9;
补充优化器基本使用方法的相关步骤:清空梯度,计算Loss,反向传播,更新参数。其中,计算Loss,反向传播两步骤的相关代码已给出;
按照格式“optimizer's lr:... ”输出optimizer的lr;
按照格式“optimizer's alpha:... ”输出optimizer的alpha。
具体请参见后续测试样例。

  • 测试说明

测试过程:

本关涉及的测试文件为RMSpropTest.py,运行用户填写后的程序判断正误。
根据程序是否包含创建正则化的关键语句来判断程序是否正确,如是否含有 optim.SGD ,len(),optimizer.param_groups等语句。
若正确则输出下面的预期输出,否则报错,打印 Sorry ! Check again please!。 注意,在声明变量时请按照提示命名,否则将会报错。
以下是测试样例:

测试输入:
预期输出:
optimizer's lr: 0.1
optimizer's alpha: 0.9

Congratulation!

真正的科学家应当是个幻想家;谁不是幻想家,谁就只能把自己称为实践家。 —— 巴尔扎克
开始你的任务吧,祝你成功!
import torch
from torch import nn, optim
from torch.autograd import Variable
import numpy as np
# Linear Regression Model
class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear = nn.Linear(1,1)  # input and output is 1 dimensiondef forward(self, x):out = self.linear(x)return outx_train = Variable(torch.randn(1,1))
y_train = Variable(torch.randn(1,1))
criterion = nn.MSELoss()model = LinearRegression()#/********** Begin *********/#声明一个 RMSprop 优化器 optimizer, 按要求设置 lr,alpha 的值
optimizer = torch.optim.RMSprop(model.parameters(), lr=0.1, alpha=0.9)  
#清空梯度
optimizer.zero_grad()
#计算Loss
loss = criterion(model(x_train), y_train)
#反向传播
loss.backward()
#更新参数
optimizer.step()
#按照格式输出optimizer的lr
print("optimizer's lr:",optimizer.param_groups[0]['lr'])
##按照格式输出optimizer的alpha
print("optimizer's alpha:",optimizer.param_groups[0]['alpha'])#/********** End *********/

第4关:Adam

  • 任务描述

本关任务:

本关要求同学们声明两个 Adam 优化器optimizer1和 optimizer2, 分别传入程序提前声明好的线性模型model_Adam1和model_Adam2的参数值,分别设置他们lr和beats的数值。并对每个优化器, 优化属于他的神经网络。从而,根据 loss的值判断哪个优化器表现较好,按照格式输出相关信息。

  • 编程要求

本关涉及的代码文件为adam.py,本次编程任务是补全右侧代码片段中Begin至End中间的代码,其中,程序提前声明好的线性模型model_Adam1和model_Adam2,和训练数据x_train、y_train,按照要求利用这些信息完成实验,具体要求如下:

声明一个Adam优化器 optimizer1, 传入model_Adam1的属性值,设置 lr为0.2,betas为(0.9,0.9);
声明一个Adam优化器 optimizer2, 传入model_Adam2的属性值,设置 lr为0.001, betas为(0.9,0.9);
程序对 迭代十次的loss值求和。要求同学们按要求输出相应语句。
若 loss1小于loss2,输出“opt_Adam1 is better than opt_Adam2”;
否则输出“opt_Adam2 is better than opt_Adam1”。
具体请参见后续测试样例。

  • 测试说明

测试过程:

本关涉及的测试文件为adamTest.py,运行用户填写后的程序判断正误。
根据程序是否包含创建正则化的关键语句来判断程序是否正确,如是否含有Adam,if,else,lr,betas等语句。
若正确则输出下面的预期输出,否则报错,打印 Sorry ! Check again please!。 注意,在声明变量时请按照提示命名,否则将会报错。
以下是测试样例:

测试输入:
预期输出:
opt_Adam1 is  better than opt_Adam2

Congratulation!

知识有如人体血液一样的宝贵。人缺少了血液,身体就要衰弱,人缺少了知识,头脑就要枯竭。——高士其
开始你的任务吧,祝你成功!
import torch
from torch import nn, optim
from torch.autograd import Variable
import numpy as np
# Linear Regression Model
class LinearRegression(nn.Module):def __init__(self):super(LinearRegression, self).__init__()self.linear = nn.Linear(2,2)  # input and output is 2 dimensiondef forward(self, x):out = self.linear(x)return outx_train = Variable(torch.from_numpy(np.array([[1,2],[3,4]], dtype=np.float32)))
y_train = Variable(torch.from_numpy(np.array([[1,5],[2,8]], dtype=np.float32)))model_Adam1 = LinearRegression()
model_Adam2 = LinearRegression()
models = [model_Adam1,model_Adam2]
#/********** Begin *********/#声明一个Adam优化器 optimizer1, 设置 lr为0.2,betas为(0.9,0.9)
opt_Adam1 = torch.optim.Adam(model_Adam1.parameters(),lr=0.2,betas=(0.9,0.9))
#声明一个Adam优化器 optimizer2, 设置 lr为0.001,betas为(0.9,0.9)
opt_Adam2 = torch.optim.Adam(model_Adam2.parameters(),lr=0.001,betas=(0.9,0.9))optimizers = [opt_Adam1,opt_Adam2]
losses_his = [[],[]]
loss_func = nn.MSELoss()for epoch in range(10):# 对每个优化器, 优化属于他的神经网络for model,opt, l_his in zip(models,optimizers, losses_his):output = model(x_train)loss = loss_func(output, y_train)opt.zero_grad()loss.backward()opt.step()l_his.append(loss.item())
loss1 = sum(losses_his[0])
loss2 = sum(losses_his[1])#利用 if-else 结构判断 loss1、loss2的大小
#若loss1小于loss2,输出“opt_Adam1 is better than opt_Adam2”;
#否则输出“opt_Adam2 is better than opt_Adam1”。
if loss1 > loss2:print("opt_Adam2 is  better than opt_Adam1")
else:print("opt_Adam1 is  better than opt_Adam2")#/********** End *********/

第5关:优化器总结

  • 任务描述

本关任务:

本关要求同学们掌握不同优化器的特点,根据提示,利用不同的优化器进行训练,并利用loss 画图。

  • 编程要求

本关涉及的代码文件为compare.py,本次编程任务是补全右侧代码片段中Begin至End中间的代码。根据提示,计算并利用loss 画图。

  • 测试说明

我会对你编写的代码进行测试:
测试过程:

本关涉及的测试文件为compareTest.py,运行用户填写后的程序判断正误。
根据程序是否包含创建正则化的关键语句来判断程序是否正确。
若正确则输出下面的预期输出,否则报错。
注意,在声明变量时请按照提示命名,否则将会报错。
测试输入:
预期输出:

Congratulation!

开始你的任务吧,祝你成功!
import torch
import torch.utils.data as Data
import torch.nn.functional as F
from torch.autograd import Variableimport matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as pltimport warnings
warnings.filterwarnings('ignore')import os,sys
path = os.path.split(os.path.abspath(os.path.realpath(sys.argv[0])))[0] + os.path.sep
print("validation path:" ,path)#定义参数
LR = 0.01
BATCH_SIZE = 32
EPOCH = 10x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = x.pow(2) + 0.1*torch.randn(x.size())
# torch_dataset = Data.TensorDataset(data_tensor=x, target_tensor=y)
torch_dataset = Data.TensorDataset(x, y) 
loader = Data.DataLoader(dataset=torch_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=2,)# 默认的 network 形式
class Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.hidden = torch.nn.Linear(1, 40)self.predict = torch.nn.Linear(40, 1)def forward(self, x):#隐藏层的激活函数x = F.relu(self.hidden(x))#线性输出x = self.predict(x)return xnet_SGD         = Net()
net_Momentum    = Net()
net_RMSprop     = Net()
net_Adam        = Net()
nets = [net_SGD, net_Momentum, net_RMSprop, net_Adam]#/********** Begin *********/opt_SGD         = torch.optim.SGD(net_SGD.parameters(), lr=LR)# 声明优化器opt_Momentum,传入对应的模型参数,lr 赋值为 LR,momentum为0.7
opt_Momentum = torch.optim.SGD(net_Momentum.parameters(),lr=LR,momentum=0.7)
# 声明优化器opt_RMSprop,传入对应的模型参数,lr 赋值为 LR,alpha为0.9
opt_RMSprop = torch.optim.RMSprop(net_RMSprop.parameters(),lr=LR,alpha=0.9)
# 声明优化器opt_Adam,传入对应的模型参数,lr 赋值为 LR,betas为(0.9, 0.99)
opt_Adam = torch.optim.Adam(net_Adam.parameters(),lr=LR,betas=(0.9,0.99))#/********** End *********/
optimizers = [opt_SGD, opt_Momentum, opt_RMSprop, opt_Adam]
loss_func = torch.nn.MSELoss()losses_his = [[], [], [], []]#训练循环
for epoch in range(EPOCH):for step, (batch_x, batch_y) in enumerate(loader):b_x = Variable(batch_x)b_y = Variable(batch_y)for net, opt, l_his in zip(nets, optimizers, losses_his):output = net(b_x)loss = loss_func(output, b_y)#/********** Begin *********/opt.zero_grad()# 反向传播loss.backward()# 更新参数 opt.step()# 记录损失    l_his.append(loss.item())   #/********** End *********/#画图
labels = ['SGD', 'Momentum', 'RMSprop', 'Adam']
for i, l_his in enumerate(losses_his):plt.plot(l_his, label=labels[i])
plt.legend(loc='best')
plt.xlabel('Steps')
plt.ylabel('Loss')
plt.ylim((0, 0.2))
plt.savefig(path + "outputimages/mylossTest.png")


http://www.hkcw.cn/article/FQABfiGrRQ.shtml

相关文章

RV1126-OPENCV Mat理解和AT函数

一.Mat概念 Mat 是整个图像存储的核心也是所有图像处理的最基础的类,Mat 主要存储图像的矩阵类型,包括向量、矩阵、灰度或者彩色图像等等。Mat由两部分组成:矩阵头,矩阵数据。矩阵头是存储图像的长度、宽度、色彩信息等头部信息&a…

DeepSeek R1-0528模型:五大升级亮点,引领AI推理新高度

在AI技术迅猛发展的浪潮中,模型的迭代升级不断推动着行业的进步。DeepSeek R1-0528模型的推出,犹如一颗重磅炸弹,在AI领域激起千层浪。它究竟有何神奇之处?下面为你揭秘其五大全新升级亮点。 深度思考能力显著提升 DeepSeek R1-05…

司机缺氧离世有5个上学孩子 家庭重担引关注

近日,46岁的河南卡车司机常志荣在青藏高原离世,卡友团队一同将其骨灰接回老家。6月1日,常志荣已经在老家安葬。他去世后,留下了重组家庭的6个孩子,其中5个孩子还在上学。车友任先生透露,常大哥出发青藏线运输前,同行曾建议他至少携带两罐氧气,但他为省下30元费用,最终…

迪士尼情侣和一家三口打架 拍照争执引发冲突

6月1日,浦东公安分局接到报警称迪士尼乐园内发生打架事件。初步调查显示,闫某某(男,22岁)与女友在拍照时,因刘某某(男,36岁)夫妻的女儿进入拍摄画面,双方发生口角并引发肢体冲突,造成闫某某和刘某某互有皮外伤,小女孩未受伤。目前,调查处理工作正在进行中。当天,…

温度计“液泡”是什么,温度计为什么能测温?

温度计“液泡”是什么,温度计为什么能测温? 液体膨胀式温度计介绍 最近,有位小朋友说,他看的一本科普书上说:把温度计插在水里,水分子就会对液泡产生撞击,液泡里面的分子就会跟着动起来&#x…

C++学习过程分享

空指针:int *p NULL; 空指针:指针变量指向内存中编号为0的空间;用途:初始化指针变量注意:空指针指向的内存不允许访问注意:内存编号为0-255为系统占用空间,不允许用户访问 野指针:…

【IC】RTL功耗高精度预测

介绍 美国能源部(DOE)的一份综合报告“半导体供应链深度潜水评估”(2022年2月)呼吁将能源效率提高1000倍,以维持未来的需求,因为世界能源产量有限。能源效率是当今设计师的首要任务。能源效率的整体方法必…

美国要求澳大利亚上调军费 提升至GDP的3.5%

当地时间6月1日,美国国防部长赫格塞思在新加坡会见了澳大利亚副总理兼国防部长理查德马尔斯。双方讨论了美澳联盟的关键优先事项。赫格塞思在会谈中建议澳大利亚尽快将国防开支提高到国内生产总值的3.5%。尽管澳大利亚不是北约成员国,美国总统特朗普此前曾多次要求北约成员国…

高反缺氧去世卡友已回老家下葬 留下6个孩子引关注

近日,46岁的河南卡车司机常志荣在青藏高原不幸离世。他的卡友团队一同将其骨灰接回老家,并于6月1日在老家安葬。常志荣去世后,留下了重组家庭的六个孩子,其中五个孩子还在上学。车友任先生透露,常志荣出发前曾被建议至少携带两罐氧气,但他为了节省30元费用,最终只购买了…

亚历山大本赛季两战步行者场均39分 雷霆双胜步行者

NBA总决赛的对阵双方是雷霆和步行者。本赛季两队交手两次,雷霆分别以120-114和132-111取胜。这两场比赛中霍姆格伦都没有出战。亚历山大在这两场比赛中的表现非常出色,场均能够贡献39分、7篮板、8助攻、1抢断和1盖帽,场均罚球次数达到11.5次,真实命中率为71.1%。在面对步行…

六地将有大到暴雨 端午出行需谨慎

中央气象台今日6时继续发布暴雨蓝色预警和强对流天气蓝色预警。福建、广东、广西等六个地区将出现大到暴雨,多地还将遭遇8级以上的雷暴大风或冰雹天气。正值端午假期最后一天,出行前请务必关注天气情况。责任编辑:zhangxiaohua

017搜索之深度优先DFS——算法备赛

深度优先搜索 如果说广度优先搜索是逐层扩散,那深度优先搜索就是一条道走到黑。 深度优先遍历是用递归实现的,预定一条顺序规则(如上下左右顺序) ,一直往第一个方向搜索直到走到尽头或不满足要求后返回上一个叉路口按…

举办中国户外运动展哪个城市较理想

杭州:强劲经济引擎,中国户外运动展的理想之选! 为什么是杭州?—— 硬核实力,无可争议! 经济活力领跑: 浙江人均GDP超2.5万美元,人均收入与消费全国TOP 1!2024年省外人口…

JMeter接口自动化脚本框架

登录后的CRUD自动化脚本 内容: 用户自定义变量 ${}引用 HTTP请求默认值:复用内容 HTTP信息头:请求类型、token、cookie setUp、tearDown线程组:前后置操作 响应断言:文本、代码 Json提取器:提取响应…

缺氧离世卡车司机已下葬卡友发声 家庭重担引关注

近日,46岁的河南卡车司机常志荣在青藏高原离世,卡友团队将其骨灰接回老家。6月1日,他在老家安葬。常志荣去世后,留下了重组家庭的6个孩子,其中5个还在上学。据车友任先生透露,常志荣出发前同行曾建议他至少携带两罐氧气,但他为省下30元费用,最终只购买了一罐氧气。常志…

【C++】多态

目录 1. 多态的概念 2. 多态的定义和实现 2.1 构成多态的条件 2.2 虚函数 2.3 虚函数的重写(覆盖) 2.4 小试牛刀 3. 重载/重写/隐藏的对比 4. 纯虚函数和抽象类 5.多态的原理 5.1 虚表 5.2 虚表指针 5.3 对比虚函数、虚表、虚表指针 1. 多态的…

肖战演活了藏海 台湾观众好评如潮

正在热播的电视剧《藏海传》在台湾引起了广泛关注,不仅获得了岛内观众的一致好评,也得到了媒体的争相报道。这部剧以其精良的制作、紧凑的情节以及所展现的中华文化深深吸引了台湾观众。5月31日,“肖战演藏海在台湾刷屏”这一话题冲上了微博热搜榜。近年来,大陆电视剧在台湾…

C# 多线程编程全面指南:从基础到高级实践

在现代软件开发中,多线程编程已成为提升应用程序性能的关键技术。C# 作为.NET平台的主力语言,提供了丰富的多线程处理机制。本文将全面介绍C#中的多线程编程技术,从基础概念到高级应用,帮助开发者掌握这一重要技能。 一、多线程基…

PASCAL VOC数据集/AI标注/算法训练推理EasyAML如何实现“数据不出域”的本地化AI标注训练

在当今数字化转型的大潮中,众多企业对AI视觉技术的需求日益增长。无论是制造业的产品质量检测、物流行业的货物识别与车辆管理,还是安防领域的视频监控与分析,AI视觉技术的应用场景广泛且多样。然而,在实际应用过程中,…

Linux系统中的shell脚本基础知识

1.shell脚本基础:shell脚本是文本的一种,属于可以运行的文本,shell脚本的内容是由逻辑和数据组成的。 2.shell脚本意义:shell脚本语言是实现Linux/unix系统管理及自动化运维所必备的重要工具。 常见shell种类:Bourne …