小例子
线性回归小例子
import torch
import torch.nn as nn
import torch.utils.data
from torch.nn.functional import *
import matplotlib.pyplot as plt
LR = 0.1 # 学习率,影响优化器参数调整的幅度,太大或太小都不行,得根据具体场景调整
BATCH_SIZE = 32
EPOCH = 5
# 造点假数据,生成一元二次函数的点,加一点随机浮动
x = torch.unsqueeze(torch.linspace(-1, 1, 1000), dim=1) # unsqueeze 把一维tensor升到二维
y = x.pow(2) + 0.2*torch.rand(x.size())
# 批训练,DataLoader把数据集打包成一批一批的,每批数据集的最大数据条数就是batch_size
torch_dataset = torch.utils.data.TensorDataset(x, y)
loader = torch.utils.data.DataLoader(dataset=torch_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=0,)
# 定义网络模型
class Net(torch.nn.Module):
def __init__(self, n_feature, n_hidden, n_output):
super(Net, self).__init__()
self.hidden = nn.Sequential(
nn.Linear(n_feature, n_hidden), # 全连接层
nn.BatchNorm1d(n_hidden) # batch normalization 层
)
self.predict = torch.nn.Linear(n_hidden, n_output)
def forward(self, x):
x = relu(self.hidden(x))
x = self.predict(x)
return x
# 这是回归问题,输入的是 x 轴的值,输出是 y 轴的值,是个数值,因此 n_feature、n_output 都是 1
net = Net(n_feature=1, n_hidden=10, n_output=1)
print(net)
# 定义损失函数, 均方差损失函数适用于本案例的回归问题
loss_func = torch.nn.MSELoss()
# 定义优化器用于加速网络训练, 随机梯度下降(stochastic gradient descent)
# 把 net.parameters() 传给它,在后续的step步骤优化器优化的就是传入的这些参数了
optimizer = torch.optim.SGD(net.parameters(), lr=LR)
plt.ion()
for epoch in range(EPOCH):
print('Epoch: ', epoch)
# 每次读取的是 DataLoader 中的一批数据,按批次训练
# step 是批次序号,(b_x, b_y)是这一批数据的输入x向量和相应的标签
for step, (b_x, b_y) in enumerate(loader):
# x参数输入网络,从网络输出的值就是与输入值对应的输出预测值
prediction = net(x)
# 预测值和真实值的差值就是损失值loss
# 训练的方向就是 loss 最小化问题
loss = loss_func(prediction, y)
# 每次训练都会把梯度保留在 optimizer 里,所以对于新批次的数据训练需要把梯度值清零
optimizer.zero_grad()
# 损失反向传播,计算出梯度
loss.backward()
# 以指定的学习率来优化更新网络中的梯度参数
optimizer.step()
if step % 5 == 0:
plt.cla()
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'})
plt.pause(0.1)
plt.ioff()
plt.show()
# 保存训练完的模型
torch.save(net.state_dict(), "net_params.pkl")
加载保存的模型
import torch
from torch.nn.functional import *
class Net(torch.nn.Module):
def __init__(self, n_feature, n_hidden, n_output):
super(Net, self).__init__()
self.hidden = torch.nn.Linear(n_feature, n_hidden) # hidden layer
self.predict = torch.nn.Linear(n_hidden, n_output) # output layer
def forward(self, x):
x = relu(self.hidden(x))
x = self.predict(x)
return x
net = Net(n_feature=1, n_hidden=10, n_output=1)
net.load_state_dict(torch.load("net_params.pkl"))
Last updated
Was this helpful?