1 数据集部分
#导入库
import torch
import matplotlib.pyplot as plt
#建议数据集
x=torch.linspace(-1,1,100)
x=x.view(-1,1)
y=torch.pow(x,2)+0.2*torch.rand(x.shape)
#y=x*x+噪声
#可视化
plt.scatter(x,y)
2 模型定义部分
import torch
import torch.nn.functional as F
#定义模型
class Net(torch.nn.Module):
def __init__(self,n_input,n_hidden,n_output):
super(Net,self).__init__()
self.hidden=torch.nn.Linear(n_input,n_hidden)
self.predict=torch.nn.Linear(n_hidden,n_output)
#定义每一层的形式(输入维度和输出维度)
#定义前向传播方式
def forward(self,x):
x=F.relu(self.hidden(x))
x=self.predict(x)
return x
#声明模型
net=Net(n_input=1,n_hidden=10,n_output=1)
print(net)
'''
Net(
(hidden): Linear(in_features=1, out_features=10, bias=True)
(predict): Linear(in_features=10, out_features=1, bias=True)
)
'''
3 模型训练+绘图
import matplotlib.pyplot as plt
#使用SGD进行梯度下降,设置学习率为0.2
optimizer=torch.optim.SGD(net.parameters(),lr=0.2)
#设置误差函数
loss_func=torch.nn.MSELoss()
#误差值组成的列表
losses=[]
#开始训练
for epoch in range(100):
prediction=net(x)
#喂给net训练数据x,输出预测值
loss=loss_func(prediction,y)
losses.append(loss.item())
#每十次画一张图
if(epoch%10==0):
plt.scatter(x,y,c='green')
plt.plot(x,prediction.detach(),c='blue')
#这里prediction是带requires_grad的,需要detach掉
plt.show()
optimizer.zero_grad()
#清空上一步残余的参数更新值
loss.backward()
#误差反向传播,计算参数更新值
optimizer.step()
#将参数更新值施加到net的parameters上
print(losses[-1])
#0.004355926997959614
第一张图:
最后一张图:
4 L2正则化
所有行都一样,只是把SGD哪一行换掉‘
optimizer=torch.optim.SGD([{'params':net.hidden.weight,'weight_decay':1},
{'params':net.hidden.bias},
{'params':net.predict.weight,'weight_decay':1},
{'params':net.predict.bias},
],
lr=0.2)
表示对hidden和predict的weight进行η等于1的L2正则化