【深度学习】CNN模型处理简单时间序列
生活随笔
收集整理的這篇文章主要介紹了
【深度学习】CNN模型处理简单时间序列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文使用CNN模型,Conv1d卷積進行時間序列的分析處理。將數據導入模型后,可以運行。但模型預測精度不高,且輸出十分不穩定。此模型僅用于熟悉CNN模型的基本結構,如有錯誤,還望海涵。
目錄
- 一、數據介紹
- 二、數據預處理
- 三、模型代碼
- 四、模型輸出結果
- 五、參考文獻
一、數據介紹
數據長度為252,在導入模型時,將80%的數據用于模型訓練,20%的數據用于模型驗證。
二、數據預處理
先對數據進行歸一化處理,以加快模型運行速度。數據預測原理為,將n個數據分為一組,用前n-1個數據來預測第n個數據,通過預測值與實際值計算損失值。再向后推進,每次推進長度為1。
例如,如果數據序列為[1,2,3,4,5,6],n=4。則第一次將[1,2,3]輸入模型,將模型輸出結果和4導入損失計算函數進行損失計算,下一次將[2,3,4]導入,以此類推。
三、模型代碼
模型結構
模型定義代碼
import torch import torch.nn as nn from tensorboardX import SummaryWriterclass CNNnetwork(nn.Module):def __init__(self):super().__init__()self.conv1d = nn.Conv1d(1, 64, kernel_size=2)self.relu = nn.ReLU(inplace=True)self.Linear1 = nn.Linear(64 * 8, 50)self.Linear2 = nn.Linear(50, 1)def forward(self, x):x = self.conv1d(x)x = self.relu(x)x = x.view(-1)x = self.Linear1(x)x = self.relu(x)x = self.Linear2(x)return xif __name__ == '__main__':mod = CNNnetwork()input = torch.ones(1, 1, 9)out = mod(input)print(out.shape)writer = SummaryWriter('logdir')writer.add_graph(mod, input)writer.close()模型訓練與驗證
import pandas as pd import numpy as np import torch from matplotlib import pyplot as plt from sklearn.preprocessing import MinMaxScaler from CNN_model import *Datasets = pd.read_excel(io='dataset.xlsx', sheet_name='Sheet1', usecols='D') data = Datasets['data'].values.astype(float) train_set = data[:-int(len(data) * 0.2)] test_set = data[-int(len(data) * 0.2):] # print(len(train_set)) # 202 # print(len(test_set)) # 50scaler = MinMaxScaler(feature_range=(-1, 1)) train_norm = scaler.fit_transform(train_set.reshape(-1, 1)) train_norm = torch.FloatTensor(train_norm).view(-1) train_data = [] seq_size = 9 for i in range(len(train_norm) - seq_size):window = train_norm[i:i + seq_size]label = train_norm[i + seq_size]train_data.append((window, label))mod = CNNnetwork()loss_fn = nn.MSELoss()learning_rate = 1e-2 optimizer = torch.optim.SGD(mod.parameters(), lr=learning_rate) # optimizer = torch.optim.Adam(mod.parameters(), lr=learning_rate) total_train_step = 0 epoch = 500 loss_list = [] mod.train() for i in range(epoch):for seq, y_true in train_data:optimizer.zero_grad()out = mod(seq.reshape(1, 1, -1))loss = loss_fn(out, y_true)loss.backward()optimizer.step()total_train_step = total_train_step + 1if total_train_step % 1000 == 0:print('訓練次數:{},loss:{}'.format(total_train_step, loss.item()))loss_list.append(loss.item())preds = train_norm[-seq_size:].tolist() mod.eval() for i in range(52):seq = torch.FloatTensor(preds[-seq_size:])with torch.no_grad():preds.append(mod(seq.reshape(1, 1, -1)).item()) print(preds) true_value = scaler.inverse_transform(np.array(preds[seq_size:]).reshape(-1, 1)) print(true_value.tolist()) print(test_set) plt.figure(1) plt.plot(test_set, label='true value') plt.plot(true_value, label='predict value') plt.legend(loc="upper left") plt.figure(2) plt.plot(loss_list, label='loss') plt.show() torch.save(mod, 'mod_1.pth')代碼中,每10個數據為一組,用reshape函數使數據符合Conv1d要求。
四、模型輸出結果
再不斷調整損失函數、優化器、學習率、訓練次數后,模型擬合效果依然不穩定。最大的原因可能為數據之間無直接關聯性,無法通過數字間的關聯找出規律。
下面為50個驗證數據的擬合效果,藍色線條為真實值,橙色為模型擬合值。
下圖為模型訓練過程中損失變化,每一千次訓練記錄一次損失。
五、參考文獻
本文數據處理及模型構建思路參考了以下文章:CNN實現時間序列預測(PyTorch版)
總結
以上是生活随笔為你收集整理的【深度学习】CNN模型处理简单时间序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux如何发现内存卡,分享|如何在
- 下一篇: 利用wordcloud库生成词云(Pyt