当前位置:   article > 正文

Python PyTorch3:神经网络、回归计算_python利用三维卷积神经网络做回归预测

python利用三维卷积神经网络做回归预测

1. 神经网络的结构

全连接(FC)网络结构是最基本的神经网络结构,每一个节点与上一层中的所有节点相连接。

BP神经网络由输入层、隐藏层和输出层组成。输入层和输出层的节点数取决于问题需要的输出和输出变量的个数,隐藏层节点数需要由开发者进行调试。

在神经网络中,只有数据非线性分离时才需要隐藏层。对于一般的数据集,1~2层隐藏层已经足够了。

隐藏层中的神经元数量由开发者调试获得。在隐藏层中使用太少的神经元将导致欠拟合。相反,使用过多的神经元可能会导致过拟合等问题。选择合适的隐藏层神经元数量至关重要。通常情况下,对所有隐藏层使用相同数量的神经元。与在每一层中添加更多的神经元相比,添加层数将获得更大的性能提升。因此,不要在一个隐藏层中加入过多的神经元。

2. 线性回归

PyTorch中使用torch.nn创建一个神经网络。自定义的神经网络继承nn.Module类。nn.Module包含神经层。在神经网络类的init构造函数中定义网络结构,forward(input)可以用来返回output输出结果。

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from torch import nn, optim
  4. from torch.autograd import Variable
  5. import torch
  6. # 创建线性函数+噪声
  7. x_data = np.random.rand(100)
  8. noise = np.random.normal(0, 0.01, x_data.shape)
  9. y_data = x_data * 0.1 + 0.2 + noise
  10. # PyTorch需要传入2维数据
  11. x_data = x_data.reshape(-1, 1)
  12. y_data = y_data.reshape(-1, 1)
  13. # 把numpy数据变成tensor
  14. x_data = torch.FloatTensor(x_data)
  15. y_data = torch.FloatTensor(y_data)
  16. # 将tensor转为pytorch的变量 数据的输入
  17. inputs = Variable(x_data)
  18. # 将tensor转为pytorch的变量 数据的目标值 输出
  19. target = Variable(y_data)
  20. # 构建神经网络模型
  21. # 类名可以随便取,需要继承torch.nn.Module类
  22. class LinearRegression(nn.Module):
  23. # 初始化方法,定义网络结构
  24. # 一般把网络中具有可学习参数的层放在__init__()中
  25. def __init__(self):
  26. # 初始化nn.Module父类
  27. super(LinearRegression, self).__init__()
  28. # 全连接层
  29. # 输入1个神经元(x),输出1个神经元(y)
  30. self.fc = nn.Linear(1, 1)
  31. # 定义网络计算
  32. def forward(self, x):
  33. # 将x传入全连接层做计算
  34. out = self.fc(x)
  35. return out
  36. # 定义模型
  37. model = LinearRegression()
  38. # 定义代价函数
  39. mse_loss = nn.MSELoss()
  40. # 定义优化器 lr学习率
  41. optimizer = optim.SGD(model.parameters(), lr=0.1)
  42. # 循环模型参数的名称和数值,包括权值和偏置值
  43. for name, parameters in model.named_parameters():
  44. print('name:{}, param:{}'.format(name, parameters))
  45. # 训练循环1001次
  46. for i in range(1001):
  47. out = model(inputs)
  48. # 计算loss
  49. loss = mse_loss(out, target)
  50. # 梯度清0
  51. optimizer.zero_grad()
  52. # 计算梯度
  53. loss.backward()
  54. # 修改权值
  55. optimizer.step()
  56. if i % 200 == 0:
  57. print(i, loss.item())
  58. # 将inputs传给模型得到预测值
  59. y_pred = model(inputs)
  60. plt.scatter(x_data, y_data)
  61. plt.plot(x_data, y_pred.data.numpy(), 'r-', lw=3)
  62. plt.show()

输出:

name:fc.weight, param:Parameter containing:
tensor([[0.4561]], requires_grad=True)
name:fc.bias, param:Parameter containing:
tensor([0.7357], requires_grad=True)
0 0.5190306901931763
200 9.697255882201716e-05
400 9.521372703602538e-05
600 9.520256571704522e-05
800 9.520251478534192e-05
1000 9.520247840555385e-05

3. 非线性回归

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from torch import nn, optim
  4. from torch.autograd import Variable
  5. import torch
  6. # 创建非线性函数+噪声
  7. x_data = np.linspace(-2, 2, 200)
  8. noise = np.random.normal(0, 0.2, x_data.shape)
  9. y_data = np.square(x_data) + noise
  10. x_data = x_data.reshape(-1, 1)
  11. y_data = y_data.reshape(-1, 1)
  12. # 把numpy数据变成tensor
  13. x_data = torch.FloatTensor(x_data)
  14. y_data = torch.FloatTensor(y_data)
  15. inputs = Variable(x_data)
  16. target = Variable(y_data)
  17. # 构建神经网络模型
  18. # 一般把网络中具有可学习参数的层放在__init__()中
  19. class LinearRegression(nn.Module):
  20. # 定义网络结构
  21. def __init__(self):
  22. # 初始化nn.Module
  23. super(LinearRegression, self).__init__()
  24. # 非线性回归需要加隐藏层
  25. # 输入1个神经元,输出10个神经元
  26. self.fc1 = nn.Linear(1, 10)
  27. # 非线性回归需要加入隐藏层,隐藏层的意义就是把输入数据的特征,抽象到另一个维度空间,来展现其更抽象化的特征,这些特征能更好的进行线性划分。
  28. # 在隐藏层中加入tanh激活函数
  29. self.tanh = nn.Tanh()
  30. # 输入10个神经元,输出1个神经元
  31. self.fc2 = nn.Linear(10, 1)
  32. # 定义网络计算
  33. def forward(self, x):
  34. x = self.fc1(x)
  35. x = self.tanh(x)
  36. x = self.fc2(x)
  37. return x
  38. # 定义模型
  39. model = LinearRegression()
  40. # 定义代价函数
  41. mse_loss = nn.MSELoss()
  42. # 定义优化器
  43. optimizer = optim.SGD(model.parameters(), lr=0.3)
  44. for name, parameters in model.named_parameters():
  45. print('name:{}, param:{}'.format(name, parameters))
  46. for i in range(2001):
  47. out = model(inputs)
  48. # 计算loss
  49. loss = mse_loss(out, target)
  50. # 梯度清0
  51. optimizer.zero_grad()
  52. # 计算梯度
  53. loss.backward()
  54. # 修改权值
  55. optimizer.step()
  56. if i % 200 == 0:
  57. print(i, loss.item())
  58. y_pred = model(inputs)
  59. plt.scatter(x_data, y_data)
  60. plt.plot(x_data, y_pred.data.numpy(), 'r-', lw=3)
  61. plt.show()

输出:

name:fc1.weight, param:Parameter containing:
tensor([[-0.5076],
        [-0.2512],
        [ 0.3506],
        [-0.3037],
        [ 0.9912],
        [ 0.3866],
        [ 0.1229],
        [ 0.2591],
        [ 0.3712],
        [ 0.8306]], requires_grad=True)
name:fc1.bias, param:Parameter containing:
tensor([-0.0394,  0.7240, -0.5776,  0.7237, -0.0722, -0.7205,  0.9501, -0.1061,
         0.2135, -0.9476], requires_grad=True)
name:fc2.weight, param:Parameter containing:
tensor([[-0.0502, -0.1002,  0.2274, -0.2604,  0.2435,  0.3001,  0.0657, -0.0459,
         -0.2467, -0.2012]], requires_grad=True)
name:fc2.bias, param:Parameter containing:
tensor([0.2703], requires_grad=True)
0 3.604307174682617
200 0.07464659959077835
400 0.09846562147140503
600 0.08561816811561584
800 0.0697840079665184
1000 0.058194875717163086
1200 0.05261123552918434
1400 0.0494537353515625
1600 0.04836893081665039
1800 0.048560041934251785
2000 0.04887966811656952 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/123536?site
推荐阅读
相关标签
  

闽ICP备14008679号