神经网络回归数据,21条,每条12个月,根据输入预测下一年
数据集:
下载链接
62090 | 62090 | 62090 | 62090 | 62090 | 62090 | 62090 | 62090 | 62090 | 62090 | 62090 | 62090 |
66093 | 63659 | 69622 | 62891 | 69490 | 69597 | 65606 | 65344 | 55211 | 62282 | 67359 | 57783 |
72788 | 68697 | 62952 | 67091 | 67943 | 70075 | 67933 | 70965 | 62850 | 70174 | 72811 | 74493 |
67273 | 76579 | 78264 | 73526 | 72034 | 67949 | 78894 | 72042 | 65274 | 79469 | 68099 | 74126 |
51317 | 46689 | 48639 | 51682 | 52741 | 55259 | 53479 | 48666 | 47879 | 46609 | 51547 | 50521 |
52337 | 56066 | 57938 | 60706 | 61810 | 63742 | 51299 | 63081 | 59382 | 60219 | 61823 | 50900 |
59408 | 66993 | 61004 | 56581 | 56670 | 60253 | 68198 | 65203 | 61700 | 64165 | 61507 | 69164 |
74321 | 68118 | 64938 | 71610 | 60436 | 60082 | 74173 | 64666 | 66424 | 71497 | 70574 | 60508 |
66457 | 76313 | 68597 | 68615 | 72981 | 74393 | 65291 | 68495 | 75722 | 78722 | 69996 | 74831 |
52525 | 58394 | 53186 | 59850 | 46975 | 46835 | 54428 | 50978 | 57341 | 53208 | 47321 | 59108 |
55963 | 59073 | 50401 | 62306 | 52325 | 62508 | 61886 | 61584 | 57269 | 58566 | 61981 | 64523 |
61268 | 67289 | 63468 | 63357 | 57389 | 55178 | 68536 | 59603 | 56271 | 58432 | 69249 | 59425 |
69886 | 70660 | 73257 | 67605 | 71318 | 68852 | 74833 | 63967 | 68653 | 67916 | 66860 | 71044 |
65061 | 73047 | 79600 | 65484 | 74952 | 73317 | 67172 | 68465 | 79874 | 66215 | 66792 | 74635 |
51151 | 48783 | 48885 | 46079 | 47485 | 46739 | 52536 | 45194 | 46242 | 45146 | 47520 | 56532 |
60845 | 57864 | 54015 | 56134 | 58675 | 54317 | 52180 | 57528 | 62286 | 52630 | 54946 | 56142 |
69868 | 59717 | 67005 | 61811 | 66963 | 63463 | 63142 | 60359 | 65805 | 68101 | 59529 | 58101 |
72836 | 65984 | 66036 | 60599 | 72472 | 62919 | 60081 | 67038 | 67628 | 63526 | 64031 | 62049 |
78491 | 71810 | 66910 | 72897 | 73976 | 71189 | 77007 | 74360 | 74407 | 79505 | 78351 | 74007 |
47608 | 51441 | 55104 | 55350 | 48313 | 56398 | 52827 | 52068 | 46131 | 52561 | 49673 | 55460 |
65241 | 58813 | 66050 | 63952 | 61595 | 60050 | 66486 | 66985 | 64233 | 70069 | 62863 | 72383 |
代码:
import pandas as pd
import torch
import torch.nn as nn # 神经网络基本工具箱
import torch.nn.functional as fun
import numpy as np
import torch.utils.data as Data
import matplotlib.pyplot as plt # 绘图模块,能绘制 2D 图表
# 定义神经网络==========================================================
class ConvNet(nn.Module): # 类 ConvNet 继承自 nn.Module
def __init__(self): # 构造方法
# 下式等价于nn.Module.__init__.(self)
super(ConvNet, self).__init__() # 调用父类构造方法
# 全连接层=========================================================
self.fc1 = nn.Linear(12, 24)
self.fc2 = nn.Linear(24, 64)
self.fc3 = nn.Linear(64, 24)
self.fc4 = nn.Linear(24, 12)
def forward(self, x):
x = torch.tanh(self.fc1(x))
x = torch.tanh(self.fc2(x))
x = torch.tanh(self.fc3(x))
x = self.fc4(x)
return x
# 读取数据
def read_data(file):
# 读取xlsx文件,并存入data,不带标签
data = pd.read_excel(file, header=None).values
ma = np.amax(data)
mi = np.amin(data)
data = (data-mi)/(ma-mi)
data = torch.Tensor(data) # 转张量
# .reshape((-1, 1)) -》转置
data = Data.TensorDataset(data[0:-2], data[1:-1])
return data,ma,mi
# ==========================================================================================================
file = 'carbon.xlsx' # 数据文件
data,ma,mi = read_data(file) # 读取数据集
batch_size = 3
train_set = torch.utils.data.DataLoader(data, batch_size=batch_size, shuffle=True) # 训练集
device = torch.device('cpu')
model = ConvNet() # 初始化模型
learning_rate = 0.0001 # 学习率
criterion = nn.MSELoss() # 平方损失函数
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
# optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) # 优化器:随机梯度下降算法
loop = 1000 # 循环次数
print("学习率为", learning_rate, "\n训练次数为:", loop)
# 开始训练=========================================
i = 0 # 绘图用
print("开始训练===================================================")
process = [] # 误差
for epoch in range(loop): # 训练 loop 次
running_loss = 0.0 # 训练误差,误差归零
# 下面这个作用是每轮打乱一次,没什么大用处,不想要可以删去
train_set = torch.utils.data.DataLoader(data, batch_size=batch_size, shuffle=True) # 训练集
# enumerate() 函数:用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标。
for i, (images, labels) in enumerate(train_set, 0):
outputs = model(images) # 正向传播
loss = criterion(outputs, labels) # 计算batch(3个一打包)误差
optimizer.zero_grad() # 梯度清零
loss.backward() # 反向传播
optimizer.step() # 更新参数
running_loss += loss.item() # 误差和
if(epoch%100 == 99):
print("第%2d/%2d 轮循环,误差为:%.4f" % (epoch + 1, loop, running_loss))
process.append(running_loss)
running_loss = 0.0 # 误差归零
# 绘制训练过程
i = i + 1
train_set = torch.utils.data.DataLoader(data, batch_size=1, shuffle=True) # 训练集
for i, (images, labels) in enumerate(train_set, 0):
plt.figure(i)
outputs = model(images) # 正向传播
labels = (labels+mi)*(ma-mi)
outputs = (outputs + mi) * (ma - mi)
plt.plot(labels[0].detach().numpy(),'g:',label = 'real')
plt.plot(outputs[0].detach().numpy(),'b:',label = 'forecast')
plt.legend(loc='lower right') # 显示上面的label
plt.xlabel('time') # x_label
i += 1
plt.figure(i)
plt.plot(list(range(len(process))), process, 'g:', label='loss')
plt.legend(loc='lower right') # 显示上面的label
plt.xlabel('time') # x_label
plt.ylabel('loss') # y_label
plt.title('loss about time') # 标题
plt.show() # 显示=========
结果:
学习率为 0.0001
训练次数为: 1000
开始训练===================================================
第100/1000 轮循环,误差为:0.1967
第200/1000 轮循环,误差为:0.1527
第300/1000 轮循环,误差为:0.0994
第400/1000 轮循环,误差为:0.0592
第500/1000 轮循环,误差为:0.0407
第600/1000 轮循环,误差为:0.0305
第700/1000 轮循环,误差为:0.0207
第800/1000 轮循环,误差为:0.0196
第900/1000 轮循环,误差为:0.0109
第1000/1000 轮循环,误差为:0.0065
剩下的大差不差,就不放出来了。