头歌之动手学人工智能-Pytorch 之线性回归
目录
第1关:初始化参数
任务描述
编程要求
测试说明
在创造家的事业中,每一步都要三思而后行,而不是盲目地瞎碰。——米丘林开始你的任务吧,祝你成功!
第2关:建立模型,定义损失和优化函数
任务描述
编程要求
测试说明
真正的科学家应当是个幻想家;谁不是幻想家,谁就只能把自己称为实践家。 —— 巴尔扎克开始你的任务吧,祝你成功!
第3关:训练模型
任务描述
编程要求
测试说明
真正的科学家应当是个幻想家;谁不是幻想家,谁就只能把自己称为实践家。 —— 巴尔扎克开始你的任务吧,祝你成功!
第4关:validation
任务描述
编程要求
测试说明
聪明的资质、内在的干劲、勤奋的工作态度和坚韧不拔的精神,这些都是科学研究成功所需要的条件。——贝弗里奇开始你的任务吧,祝你成功!
第1关:初始化参数
经过之前几节实训的学习,想必同学们对 Pytorch 的基础定义和应用有了一个基本的了解。接下来,利用线性回归分析综合应用之前的知识。
-
任务描述
本关要求同学们学习数据转换、数据加载的方法,为之后算法的学习提供适宜的样本数据。
本关任务:本关要求下载MNIST 书写数据集,并创建DataLoader变量data_loader,输出 data _loader 中数据大小。
-
编程要求
本关涉及的代码文件为data.py,本次编程任务是补全右侧编辑器中Begin至End中间的代码,具体要求如下:
下载MNIST 数据集,保存到当前目录的./data中;
创建batch_size=100, shuffle=True的DataLoader;
输出 data_loader中数据类型;
具体请参见后续测试样例。
-
测试说明
测试过程:
本关涉及的测试文件为dataTest.py,运行用户填写后的程序判断正误;
测试程序将检测两个方面:是否包含特定的代码行以及程序的输出是否正确,若两个方面均正确则输出下面的预期输出,否则报错;
请注意输出格式及规范;
注意,在声明变量时,请按照提示命名,否则将会报错。
以下是测试样例:
测试输入:
预期输出:
Files already downloaded
<class 'torchvision.datasets.mnist.MNIST'>Congratulation!
在创造家的事业中,每一步都要三思而后行,而不是盲目地瞎碰。——米丘林
开始你的任务吧,祝你成功!
import torch
import torchvision.datasets as dsets
import torchvision.transforms as transforms#/********** Begin *********/
# 下载MNIST数据集Mnist_dataset = dsets.MNIST(root='./data',train=True,transform=transforms.ToTensor(),download=True)# 创建batch_size=100, shuffle=True的DataLoader类型的变量data_loaderdata_loader = torch.utils.data.DataLoader(dataset=Mnist_dataset,
batch_size=100,shuffle=True)# 输出 data_loader中数据类型print("<class '"+ str(type(data_loader.dataset))+"'>")#/********** End *********/
第2关:建立模型,定义损失和优化函数
准备好数据之后,我们就要开始建立线性回归模型了!
-
任务描述
本实训主要针对线性回归模型进行学习,继承Modules类,并实现其__init__()、forward()方法。
本关任务:本关提供了一个继承自nn.Module 的类LinearRegression,拥有创建线性模型的基本框架,按照要求补充其__init__()、forward()方法。 并通过实例化一个新建的模型,输出该模型的.parameters属性。
-
编程要求
本关涉及的代码文件为createModule.py,本次编程任务是补全右侧编辑器中Begin至End中间的代码,具体要求如下:
完成__init__()、forward()方法;
实例化一个新建的模型model;
输出该模型 model 的.parameters属性;
具体请参见后续测试样例。
-
测试说明
测试过程:
本关涉及的测试文件为moduleTest.py,运行用户填写后的程序判断正误;
测试程序将检测两个方面:是否包含特定的代码行以及程序的输出是否正确,若两个方面均正确则输出下面的预期输出,否则报错;
请注意输出格式及规范;
注意,在声明变量时,请按照提示命名,否则将会报错。
以下是测试样例:
测试输入:
预期输出:
<bound method Module.parameters of LinearRegression(
(linear): Linear(in_features=1, out_features=1)
)>Congratulation!
真正的科学家应当是个幻想家;谁不是幻想家,谁就只能把自己称为实践家。 —— 巴尔扎克
开始你的任务吧,祝你成功!
import torch.nn as nn#/********** Begin *********/# 线性回归模型
class LinearRegression(nn.Module):def __init__(self):# 调用Module的初始化super(LinearRegression, self).__init__()# 输入和输出分别为一维self.linear = nn.Linear(1, 1)# module调用forward,将按forward进行前向传播,并构建网络def forward(self, x):out = self.linear(x)return out # 实例化一个新建的模型变量model
model = LinearRegression()# 输出该模型 model 的'.parameters'属性print(model.parameters)#/********** End *********/
第3关:训练模型
本关卡将介绍如何利用之前加载的数据、定义的损失函数、优化函数,来训练模型。从而帮助同学们掌握模型的训练方法及训练结果的显示。
-
任务描述
本关任务:本关利用上一节构造的模型进行训练,并创建类型为MSELoss的损失函数,创建类型为SGD的优化算子,补充前向计算、反馈求导、优化等语句,根据num_epochs的设定共训练60次,分10次输出一回loss的数值信息。
-
编程要求
本关涉及的代码文件为train.py,本次编程任务是补全右侧编辑器中Begin至End中间的代码,具体要求如下:
创建损失函数MSELoss ;
创建SGD的 Optimizer,学习率为0.001;
训练模型,补充前向计算、反馈求导、优化等语句;
根据num_epochs的设定,共训练60次,分10次输出一回loss的数值信息;
具体请参见后续测试样例。
-
测试说明
测试过程:
本关涉及的测试文件为trainTest.py,运行用户填写后的程序判断正误;
测试程序将检测两个方面:是否包含特定的代码行以及程序的输出是否正确,若两个方面均正确则输出下面的预期输出,否则报错;
请注意输出格式及规范;
注意,在声明变量时请按照提示命名,否则将会报错。
以下是测试样例:
测试输入:
预期输出:
There are 6 lines of information about loss.
Congratulation!
真正的科学家应当是个幻想家;谁不是幻想家,谁就只能把自己称为实践家。 —— 巴尔扎克
开始你的任务吧,祝你成功!
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from torch.autograd import Variableimport os
import sys
path = os.path.split(os.path.abspath(os.path.realpath(sys.argv[0])))[0] + os.path.sepprint(path)# 超参数
input_size = 1
output_size = 1
num_epochs = 60
learning_rate = 0.001# 数据集
x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],[9.779], [6.182], [7.59], [2.167], [7.042],[10.791], [5.313], [7.997], [3.1]], dtype=np.float32)y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573],[3.366], [2.596], [2.53], [1.221], [2.827],[3.465], [1.65], [2.904], [1.3]], dtype=np.float32)# 线性回归模型
class LinearRegression(nn.Module):def __init__(self, input_size, output_size):super(LinearRegression, self).__init__()self.linear = nn.Linear(input_size, output_size)def forward(self, x):out = self.linear(x)return outmodel = LinearRegression(input_size, output_size)#创建输出文件 output.txt
f = open(path + 'output.txt', 'w')
f.seek(0)
f.truncate() #清空文件#/********** Begin *********/
# 创建损失函数MSELoss
criterion = nn.MSELoss()
# 创建SGD的Optimizer,学习率l'r为0.001
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)# 训练模型
for epoch in range(num_epochs):# 将x_train,y_train数据转换为Variable类型inputs = Variable(torch.from_numpy(x_train))targets = Variable(torch.from_numpy(y_train))# Forwardoptimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, targets)# Backwardloss.backward()#Optimizeoptimizer.step()#共训练60次,分别10次输出一回loss信息,并将输出信息存到文件中if (epoch+1) % 10 == 0:f.writelines('Epoch [%d/%d], Loss: %.4f \n'%(epoch+1, num_epochs, loss.item()))print ('Epoch [%d/%d], Loss: %.4f'%(epoch+1, num_epochs, loss.item()))
f.close()#/********** End *********/#保存模型
torch.save(model,path + 'model.pkl')
第4关:validation
本关卡将介绍如何利用之前加载的数据、定义的损失函数、优化函数,来训练模型。从而帮助同学们掌握模型的训练方法及训练结果的显示。
-
任务描述
本关要求掌握模型测试和训练之间的转换,及如何评估一个模型的好坏。
本关任务:本关提供了数据集x_train,y_train,并加载之前所训练的模型 module,要求同学们将模型转化为测试模式,利用 model 计算预测值,并将结果可视化的显示出来。
-
编程要求
本关涉及的代码文件为validation.py,本次编程任务是补全右侧编辑器中Begin至End中间的代码,具体要求如下:
将模型转化为测试模式;
利用 model 计算预测值;
画图;
具体请参见后续测试样例。
-
测试说明
测试过程:
本关涉及的测试文件为validationTest.py,该程序将用户生成的图片与系统内的测评图片,利用直方图进行图片相似度的对比;
测试程序将检测两个方面:是否包含特定的代码行以及程序的输出是否正确,若两个方面均正确则输出下面的预期输出,否则报错;
请注意输出格式及规范;
注意,在声明变量时请按照提示命名,否则将会报错。
以下是测试样例:
测试输入:
预期输出:
Congratulation !
聪明的资质、内在的干劲、勤奋的工作态度和坚韧不拔的精神,这些都是科学研究成功所需要的条件。——贝弗里奇
开始你的任务吧,祝你成功!
import torch
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as pltfrom torch.autograd import Variable
import torch.nn as nnimport warnings
warnings.filterwarnings('ignore')import os,sys
path = os.path.split(os.path.abspath(os.path.realpath(sys.argv[0])))[0] + os.path.sep
path = path[:-6]
print("validation path:" ,path)# Linear Regression Model
class LinearRegression(nn.Module):def __init__(self, input_size, output_size):super(LinearRegression, self).__init__()self.linear = nn.Linear(input_size, output_size)def forward(self, x):out = self.linear(x)return outmodel = LinearRegression(1, 1)x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],[9.779], [6.182], [7.59], [2.167], [7.042],[10.791], [5.313], [7.997], [3.1]], dtype=np.float32)y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573],[3.366], [2.596], [2.53], [1.221], [2.827],[3.465], [1.65], [2.904], [1.3]], dtype=np.float32)#加载整个模型
model = torch.load( path + 'step3/model.pkl')#/********** Begin *********/
#将模型转化为测试模式
model.eval()
#利用 model 计算预测值,并赋值给predicted
predicted = model(Variable(torch.from_numpy(x_train))).data.numpy()print(predicted)
#画图
plt.plot(x_train, y_train, 'ro', label='Original data')
plt.plot(x_train, predicted, label='Fitted line')
plt.legend()
plt.savefig(path + "step4/outputimages/mylossTest.png")#/********** End *********/