步骤: 1、准备训练集 2、设计模型 3、创建损失函数和优化器 4、训练
代码语言:javascript复制def func(*args, **kwargs):
print(args)
print(kwargs)
func(1,2,3,4,a=1,b=2,c=3)
输出:
(1, 2, 3, 4)
{'a': 1, 'b': 2, 'c': 3}
定义函数时,*args作用:传入参数个数不限 **kwargs作用:将“a=1”形式的参数转化成字典
准备训练集 数据集和之前本专栏第一篇的线性模型一样
设计模型
代码语言:javascript复制class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
self.linear = torch.nn.Linear(1, 1) # 1,1表示设置的线性模型中有两个参数w和b
def forward(self, x):
y_pred = self.linear(x)
return y_pred
model = LinearModel()
pytorch的nn库中有许多默认模型,nn即neural network
函数torch.nn.Linear(in_features,out_features,bias=True) in_features:指的是输入的二维张量的大小 out_features指的是输出的二维张量的大小 偏置bias默认为True
创建损失函数和优化器
代码语言:javascript复制criterion = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
损失函数这里采用了MSELoss:MSE即(y’-y)^2,size_average即是否/N,除不除一般差不多 torch.optim.SGD(model.parameters(), lr=0.01)中 model.parameters()为模型的参数 使用时,它会检测实例化的model中所有成员中的参数,比如本例中的model下有liner成员,liner中有w和b两个参数,运行本条语句,即告诉程序有这两个参数需要梯度下降。 lr即学习率
训练
代码语言:javascript复制for epoch in range(100):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print (epoch,loss)
optimizer.zero_grad()
loss.backward()
optimizer.step()
optimizer.zero_grad()梯度清零不可少 optimizer.step()更新update
检测
代码语言:javascript复制# Output weight and bias
print ('w = ', model.linear.weight.item())
print ('b = ', model.linear.bias.item())
# Test Model
x_test = torch.Tensor([[ 4.0 ]])
y_test = model(x_test)
print ('y_pred = ', y_test.data)
顺便提一下交叉验证集的意义:当训练次数过多时候,容易发生过拟合,这时候在训练集上切出一部分做交叉验证集,分训练次数进行画图,如果验证集的损失函数上升就代表次数过多了,发生过拟合。
完整代码:
代码语言:javascript复制import torch
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])
class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
self.linear = torch.nn.Linear(1, 1) # 1,1表示设置的线性模型中有两个参数w和b
def forward(self, x):
y_pred = self.linear(x)
return y_pred
model = LinearModel()
criterion = torch.nn.MSELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
for epoch in range(100):
y_pred = model(x_data)
loss = criterion(y_pred, y_data)
print (epoch,loss)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# Output weight and bias
print ('w = ', model.linear.weight.item())
print ('b = ', model.linear.bias.item())
# Test Model
x_test = torch.Tensor([[ 4.0 ]])
y_test = model(x_test)
print ('y_pred = ', y_test.data)
除了SGD,pytorch还有其它的优化器,这里不作进一步研究