import torch import matplotlib.pyplot as plt #定义训练集和训练集的答案 input_train = torch.linspace(-2, 2, steps=200) input_train = input_train.view(200, 1) print("input_train:", input_train) noise = torch.normal(mean=torch.zeros(200, 1), std=0.2) print("noise:", noise) answer_train = torch.pow(input_train, 2) + noise print("answer_train:", answer_train) #定义非线性回归模型 class NoneLinearRegression(torch.nn.Module): def __init__(self): #初始化父类 super(NoneLinearRegression, self).__init__() #定义网络的神经元torch.nn.Linear(1, 10)中的1是全连接层的神经元个, 10是隐藏层神经元的个数 self.NoneLinear1 = torch.nn.Linear(1, 10) #定义神经网络的激活函数(这里使用的是双曲正切‘tanh’激活函数) self.tanh = torch.nn.Tanh() #定义网货的神经元torch.nn.Linear(10, 1)中的10是隐藏层神经元的个数, 1是第二个全连接层的个数 self.NoneLinear2 = torch.nn.Linear(10, 1) #定义前向计算 def forward(self, input): #将数据传入第一个全连接层完成计算 output = self.NoneLinear1(input) #将数据传入激活函数进行计算 output = self.tanh(output) #将数据传入第二个全连接层进行计算并返回计算得到的值 output = self.NoneLinear2(output) return output #定义模型 model = NoneLinearRegression() #定义损失函数 mse_loss = torch.nn.MSELoss(reduction='mean') #定义优化器(注意model.parameters()一定要加(), 否则返回的不是一个可迭代的值) optimizer = torch.optim.SGD(model.parameters(), lr=0.3) #显示模型中的参数 for name, parameters in model.named_parameters(): print("Parameter's name is:", name) print("Parameter's value is:", parameters) #通过训练集对模型进行训练 for epoch in range(2000): #先进行数据传入进行前向计算 output_train = model(input_train) #计算损失 loss = mse_loss(answer_train, output_train) #每200次查看一次损失值 if (epoch + 1) % 200 == 0: print("第", epoch + 1, "次训练损失值为:", loss.item()) #进行梯度清零 optimizer.zero_grad() #通过损失反向计算梯度 loss.backward() #通过优化器将更新的参数传给模型 optimizer.step() #通过自己输入一个测试集来测试模型训练的结果如何 input_test = input_train output_test = model(input_test) #通过图像显示出模型的训练效果 plt.scatter(input_train, answer_train) #显示模型的训练结果和输入结果的拟合线 plt.plot(input_test.data.numpy(), output_test.data.numpy(), 'r-', lw=3) plt.show()
非线性回归模型的创建,训练以及测试
最新推荐文章于 2024-10-08 19:06:52 发布