通用结构
首先:导入相关库
import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch from torch import nn from torch.autograd import Variable plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False
step1:建立数据集,Train and Test
step2:建立模型
class BP(nn.Module): def __init__(self, input_size=576, output_size=288): super(BP, self).__init__() self.bp = nn.Sequential( nn.Linear(input_size, 288), nn.Linear(288, 144), nn.Linear(144, 72), nn.Linear(72, output_size), ) def forward(self, x): result = self.bp(x) return result
另外一种写法
def create_net(): net = nn.Sequential() net.add_module("linear1",nn.Linear(15,20)) net.add_module("relu1",nn.ReLU()) net.add_module("linear2",nn.Linear(20,15)) net.add_module("relu2",nn.ReLU()) net.add_module("linear3",nn.Linear(15,1)) net.add_module("sigmoid",nn.Sigmoid()) return net net = create_net() print(net)
效果都一样
Sequential(
(linear1): Linear(in_features=15, out_features=20, bias=True)
(relu1): ReLU()
(linear2): Linear(in_features=20, out_features=15, bias=True)
(relu2): ReLU()
(linear3): Linear(in_features=15, out_features=1, bias=True)
(sigmoid): Sigmoid()
)
step3:设置误差计算方法(均方差)及模型优化方法
model = BP()
criterion = nn.MSELoss() optimizer = torch.optim.Adam(model.parameters(), lr=1e-2) # 1e-2
step4:训练
for e in range(3000): var_x = Variable(Train_x) var_y = Variable(Train_y) # 前向传播 var_x = torch.tensor(var_x, dtype=torch.float32) var_y = torch.tensor(var_y, dtype=torch.float32) out = model(var_x) loss = criterion(out, var_y) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() if (e + 1) % 10 == 0: # 每 10 次输出结果 print('Epoch: {}, Loss: {:.5f}'.format(e + 1, loss.item()))
step5:使用测试集进行预测
model = model.eval() # 转换成测试模式 Test_x = Variable(Test_x) Test_x = torch.tensor(Test_x, dtype=torch.float32) pred_test = model(Test_x) # 测试集的预测结果 # 改变输出的格式 pred_test = pred_test.view(-1).data.numpy()
常用损失函数总结
nn.CrossEntropyLoss() # 交叉熵,用于分类问题 nn.MSELoss() # 均方误差,拟合 回归问题
常用优化器总结
torch.optim.SGD # 带动量SGD优化算法 torch.optim.ASGD # 表示随机平均梯度下降 torch.optim.Adagrad # 是自适应的为各个参数分配不同的学习率 torch.optim.Adadelta # Adadelta是Adagrad的改进。Adadelta分母中采用距离当前时间点比较近的累计项,这可以避免在训练后期,学习率过小。 torch.optim.RMSprop # 也是对Adagrad的一种改进。RMSprop采用均方根作为分母,可缓解Adagrad学习率下降较快的问题 torch.optim.Adam(AMSGrad) # Adam是一种自适应学习率的优化方法,Adam利用梯度的一阶矩估计和二阶矩估计动态的调整学习率