python 神经网络回归

神经网络回归数据,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

 

 

 剩下的大差不差,就不放出来了。

猜你喜欢

转载自blog.csdn.net/weixin_58196051/article/details/130307529
今日推荐