声明:感谢李沐老师,学习内容基于序言 — 动手学深度学习 2.0.0-beta0 documentation (d2l.ai)
一、读取数据集。
这里我们选取的数据集是Kaggle竞赛平台的一个数据集:Student Performance Data Set | Kaggle 选取了其中的数学成绩数据集。
对非数值型数据进行编码处理,对G1,G2,G3进行分组处理。
import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l
import pandas as pd
from torch import nn # nn是神经网络的缩写
df = pd.read_csv('D:/张文奇昆工/student/mat123.csv')
因为属性特征(school,sex等)对最终成绩G3的相关性很低,所以我们选取G1,G2来预测G3。
inputs = torch.tensor(df.iloc[:,30:32].values).float() outputs = torch.tensor(df.iloc[:,32:33].values).float()
在上一篇文章从零实现线性回归中抽取小批量数据样本的data_iter函数中用到了for循环,for循环花销很大,所以用深度学习框架中的内置迭代器来实现这个功能。
def load_array(data_arrays, batch_size, is_train=True): #@save
"""构造一个PyTorch数据迭代器"""
dataset = data.TensorDataset(*data_arrays)
return data.DataLoader(dataset, batch_size, shuffle=is_train)
我们打印一个批量大小为10的数据样本。
batch_size = 10 data_iter = load_array((inputs, outputs), batch_size) print(next(iter(data_iter))
二、定义模型:
定义模型的目的:将模型的输入和参数同模型的输出关联起来。为了简化模型构建的过程,我们可以使用框架预先定义好的层。我们要了解Sequential类,Sequential类将多个层串联起来。以后我们遇到多层的模型会用到Sequential。Sequential实例将数据传到第一层,然后将第一层的输出作为下一层的输入,以此类推。
net = nn.Sequential(nn.Linear(2, 1))
三、初始化模型参数:
可以使用_结尾的办法将参数替换,实现参数的初始化。
net[0].weight.data.normal_(0, 0.01) net[0].bias.data.fill_(0)
四、 定义损失函数:
loss = nn.MSELoss()
五、 定义优化算法:
小批量随机梯度下降算法
trainer = torch.optim.SGD(net.parameters(), lr=0.03)
六、 训练:
步骤:1、读取一小批量的训练样本,通过我们的模型获得一组预测。
2、计算损失,我们开始反向传播,存储每个参数的梯度。
3、使用优化算法SGD来更新模型的参数。
num_epochs = 30
for epoch in range(num_epochs):
for X, y in data_iter:
l = loss(net(X) ,y)
trainer.zero_grad()
l.backward()
trainer.step()
l = loss(net(inputs), outputs)
print(f'epoch {epoch + 1}, loss {l:f}')



