中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

AI應用實戰(zhan)課(ke)學(xue)習總(zong)結(11)用RNN做時(shi)序(xu)預(yu)測(ce)

大(da)家好,我是Edison。

最近入(ru)坑黃佳老師的《AI應用(yong)實戰課》,記錄下我的學習之旅,也(ye)算是總結(jie)回顧。

今天(tian)是我們的第11站,一(yi)起了解RNN循環(huan)神經網絡的基本概念 以及 通過(guo)RNN來做(zuo)時序預測的案例(li)。

RNN循環神經網絡介紹

RNN(循環(huan)神經(jing)(jing)網絡)是(shi)一種(zhong)專門用于處(chu)理序(xu)(xu)列(lie)數(shu)據(ju)的(de)神經(jing)(jing)網絡架構。與傳(chuan)統的(de)神經(jing)(jing)網絡不同,RNN具有記憶能力,能夠(gou)捕捉序(xu)(xu)列(lie)數(shu)據(ju)中的(de)時間(jian)依(yi)賴關系(xi)。

我們以(yi)一(yi)(yi)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)例子來說RNN,有(you)多個(ge)(ge)(ge)(ge)(ge)(ge)(ge)學(xue)(xue)(xue)(xue)(xue)生(sheng)站成了(le)一(yi)(yi)排,老師給(gei)第(di)一(yi)(yi)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)學(xue)(xue)(xue)(xue)(xue)生(sheng)一(yi)(yi)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)紙(zhi)條(tiao)(tiao),上(shang)面(mian)寫著一(yi)(yi)句話,然(ran)后(hou)這(zhe)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)學(xue)(xue)(xue)(xue)(xue)生(sheng)需要理(li)解紙(zhi)條(tiao)(tiao)上(shang)的(de)(de)(de)(de)(de)第(di)一(yi)(yi)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)字(zi)(zi)的(de)(de)(de)(de)(de)內(nei)(nei)容(rong),然(ran)后(hou)再將紙(zhi)條(tiao)(tiao)傳(chuan)(chuan)(chuan)給(gei)下(xia)(xia)一(yi)(yi)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)學(xue)(xue)(xue)(xue)(xue)生(sheng),下(xia)(xia)一(yi)(yi)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)學(xue)(xue)(xue)(xue)(xue)生(sheng)理(li)解第(di)二個(ge)(ge)(ge)(ge)(ge)(ge)(ge)字(zi)(zi)的(de)(de)(de)(de)(de)內(nei)(nei)容(rong),然(ran)后(hou)再傳(chuan)(chuan)(chuan)給(gei)第(di)三個(ge)(ge)(ge)(ge)(ge)(ge)(ge)學(xue)(xue)(xue)(xue)(xue)生(sheng)理(li)解第(di)三個(ge)(ge)(ge)(ge)(ge)(ge)(ge)字(zi)(zi)的(de)(de)(de)(de)(de)內(nei)(nei)容(rong),以(yi)此(ci)類推不斷往(wang)后(hou)傳(chuan)(chuan)(chuan)。與此(ci)同時(shi),每個(ge)(ge)(ge)(ge)(ge)(ge)(ge)學(xue)(xue)(xue)(xue)(xue)生(sheng)還(huan)有(you)一(yi)(yi)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)自(zi)己(ji)(ji)的(de)(de)(de)(de)(de)筆(bi)記(ji)本(ben),記(ji)錄著自(zi)己(ji)(ji)對自(zi)己(ji)(ji)需要理(li)解的(de)(de)(de)(de)(de)那(nei)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)字(zi)(zi)的(de)(de)(de)(de)(de)理(li)解,但可(ke)能并不是(shi)(shi)第(di)一(yi)(yi)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)字(zi)(zi)的(de)(de)(de)(de)(de)真實內(nei)(nei)容(rong),這(zhe)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)筆(bi)記(ji)本(ben)也(ye)會從(cong)(cong)第(di)一(yi)(yi)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)學(xue)(xue)(xue)(xue)(xue)生(sheng)傳(chuan)(chuan)(chuan)到(dao)后(hou)續(xu)的(de)(de)(de)(de)(de)學(xue)(xue)(xue)(xue)(xue)生(sheng)。因(yin)此(ci),從(cong)(cong)第(di)二個(ge)(ge)(ge)(ge)(ge)(ge)(ge)學(xue)(xue)(xue)(xue)(xue)生(sheng)開始(shi),就有(you)兩條(tiao)(tiao)信(xin)息(xi)來源,一(yi)(yi)條(tiao)(tiao)是(shi)(shi)老師給(gei)的(de)(de)(de)(de)(de)紙(zhi)條(tiao)(tiao)自(zi)己(ji)(ji)需要去理(li)解自(zi)己(ji)(ji)負責的(de)(de)(de)(de)(de)那(nei)塊(kuai)內(nei)(nei)容(rong),另一(yi)(yi)條(tiao)(tiao)是(shi)(shi)前面(mian)同學(xue)(xue)(xue)(xue)(xue)傳(chuan)(chuan)(chuan)來的(de)(de)(de)(de)(de)筆(bi)記(ji)本(ben)可(ke)以(yi)去參考上(shang)一(yi)(yi)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)同學(xue)(xue)(xue)(xue)(xue)給(gei)到(dao)的(de)(de)(de)(de)(de)一(yi)(yi)些總結的(de)(de)(de)(de)(de)隱藏信(xin)息(xi),直到(dao)將這(zhe)條(tiao)(tiao)紙(zhi)條(tiao)(tiao)上(shang)的(de)(de)(de)(de)(de)這(zhe)句話理(li)解完(wan)畢,再開始(shi)下(xia)(xia)一(yi)(yi)個(ge)(ge)(ge)(ge)(ge)(ge)(ge)紙(zhi)條(tiao)(tiao)的(de)(de)(de)(de)(de)理(li)解傳(chuan)(chuan)(chuan)遞。

從上面的解釋看出,RNN對于每(mei)個序列(lie)在做(zuo)循環處理,并且具有記(ji)憶功能,通過這(zhe)種(zhong)方式來捕(bu)捉序列(lie)模(mo)式和依(yi)賴關系。

RNN經常(chang)用(yong)于下列(lie)場景:

  • 時間序列預測:例如(ru)股票(piao)市場預(yu)(yu)測、氣(qi)象預(yu)(yu)測、流量分析(xi)等;

  • 自然語言處理:例如文本生成、情感(gan)分(fen)析、機器翻譯(yi)等;

  • 語音識別:將語音信號轉換成文本,廣泛用于語音助手、轉寫工(gong)具(ju)等;

  • 視頻分析:處理視頻數據中的連(lian)續幀,進行動作(zuo)識別、事件檢測等;

RNN的幾種變體

主要的RNN變(bian)體有以下幾種:

(1)Simple RNN

最原始的版(ban)本,它(ta)里面有一個時間狀態(tai)信息(xi)作為短期記(ji)憶。它(ta)存(cun)在的問題是短期記(ji)憶,記(ji)不住太長的東(dong)西,處理到后面會把(ba)前面的內容忘記(ji)了。

(2)LSTM

LSTM就解決(jue)(jue)了一部分短期(qi)記憶的(de)問(wen)題(ti)(ti),當(dang)然它的(de)設計也復雜得多(duo)。但(dan)是它也沒有完美(mei)的(de)解決(jue)(jue)短期(qi)記憶問(wen)題(ti)(ti),直到后期(qi)Transformer的(de)自注意(yi)力(li)機(ji)制(zhi)出現,才把(ba)這個(ge)問(wen)題(ti)(ti)真正地解決(jue)(jue)。

(3)GRU

它解決了Simple RNN的問題,又比LSTM的設計簡(jian)單(dan)一些,算是一個(ge)折中的方(fang)案(an)。

各種神經網絡的比較(jiao)

(1)DNN(深度神(shen)經網絡)

場景:

  • 結構化數據(ju)的分類和回歸問(wen)題
  • 一些基本(ben)的圖(tu)像識別任務

優(you)勢:對(dui)于非序列數據(ju),DNN可(ke)以是一個良好的起點。

(2)RNN(循環神經網(wang)絡)

場(chang)景:

  • 時間(jian)序列預測
  • 語音識別
  • 語言(yan)模型和文本(ben)生(sheng)成
  • 機(ji)器翻譯

優勢:RNN設計(ji)用來捕捉時(shi)間或(huo)序列數據(ju)中的(de)依賴關系,例如給(gei)定之前的(de)單詞(ci)(ci)或(huo)時(shi)間步,預測下一個單詞(ci)(ci)或(huo)時(shi)間步的(de)值。注意:需要注意RNN可(ke)能會遇(yu)到長序列的梯(ti)度消失(shi)或梯(ti)度爆炸的問題。

(3)CNN(卷積(ji)神經網(wang)絡)

場景:

  • 圖像分類、對象檢測(ce)和圖像生成
  • 語音識別(bie)和一些文本分類任務

優勢(shi):CNN可以捕捉到輸入數據(ju)(ju)的局部特(te)征(zheng),并且(qie)具(ju)有參數共享的特(te)性,這使得它(ta)非(fei)常(chang)適(shi)合處理圖像和其他具(ju)有空(kong)間(jian)(jian)或時間(jian)(jian)連續性的數據(ju)(ju)。

RNN做時序預測案例

問題背景:

  • 某(mou)App記錄了過去兩年每天(tian)的用戶(hu)注冊人數數據

問題目標:

  • 根據(ju)歷史(shi)數(shu)據(ju),預測后續一(yi)段時(shi)間的(de)用戶注冊(ce)數(shu)?

RNN做時序預測代碼實(shi)戰

Step1 讀取數據并做歸一化處理

# 導(dao)入所需(xu)庫(ku)
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from torch.autograd import Variable

df_app = pd.read_csv('app-user-activiation-data.csv', index_col='Date', parse_dates=['Date']) #導入數(shu)據
# 按照2020年10月1日為界拆分數據集
Train = df_app[:'2020-09-30'].iloc[:,0:1].values #訓練集(ji)
Test = df_app['2020-10-01':].iloc[:,0:1].values #測試集
from sklearn.preprocessing import MinMaxScaler #導(dao)入歸一化縮放器
Scaler = MinMaxScaler(feature_range=(0,1)) #創建縮放器
Train = Scaler.fit_transform(Train) #擬合縮放(fang)器并對訓練(lian)集進(jin)行(xing)歸(gui)一化(hua)
# 對測試數據進行歸一化處(chu)理
Test = Scaler.transform(Test)

然后,借助matplotlib繪(hui)制用(yong)戶注冊人數圖(tu):

import matplotlib.pyplot as plt #導入matplotlib.pyplot
plt.style.use('fivethirtyeight') #設定(ding)繪圖風格
df_app["Activation"].plot(figsize=(12,4),legend=True) #繪制激(ji)活數
plt.title('App Activation Count') #圖(tu)題
plt.show() #繪圖

繪(hui)制(zhi)出來的(de)圖如下所示:

Step2 將數據集轉化為序列 和 張量

為了能夠(gou)將數(shu)據(ju)集轉化(hua)為PyTorch可(ke)以(yi)識(shi)別的內(nei)容,需(xu)要(yao)對(dui)數(shu)據(ju)集做時(shi)序轉換(huan) 以(yi)及 張量轉換(huan)。

# 創建一(yi)個函數(shu),將數(shu)據集(ji)轉化為時間序列格式
def sliding_windows(data, seq_length):
    x = []
    y = []
    for i in range(len(data)-seq_length):
        _x = data[i:(i+seq_length)]
        _y = data[i+seq_length]
        x.append(_x)
        y.append(_y)
    return np.array(x),np.array(y)
# 設(she)定窗口大小
seq_length = 4
x_train, y_train = sliding_windows(Train, seq_length)
# 使用滑動窗口(kou)為測試(shi)數據創建特征和標簽(qian)
x_test, y_test = sliding_windows(Test, seq_length)
# 將數據轉化為torch張(zhang)量
testX = Variable(torch.Tensor(np.array(x_test)))
testY = Variable(torch.Tensor(np.array(y_test)))

Step3 設置模型參數 及 定義RNN

# 設置模(mo)型參數
input_size = 1
hidden_size = 64
num_layers = 1
output_size = 1

class RNN(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size):
        super(RNN, self).__init__()
        
        self.hidden_size = hidden_size
        
        # RNN層(ceng)
        self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
        
        # 全連接(jie)層(ceng),用于輸(shu)出
        self.fc = nn.Linear(hidden_size, output_size)
    def forward(self, x):
        # 初始化隱(yin)狀(zhuang)態
        h0 = Variable(torch.zeros(num_layers, x.size(0), self.hidden_size))
        
        # 前向傳播RNN
        out, _ = self.rnn(x, h0)
        
        # 解碼RNN的最后一(yi)個隱藏層的輸出
        out = self.fc(out[:, -1, :])
        
        return out

Step4 創建模型 和 訓練模型

# 創建模型
rnn = RNN(input_size, hidden_size, num_layers, output_size)
# 定(ding)義損失函數和優(you)化(hua)器
criterion = torch.nn.MSELoss()    # 均方誤差
optimizer = torch.optim.Adam(rnn.parameters(), lr=0.01)   # Adam優化器(qi)
# 將數據轉化為(wei)torch張量
trainX = Variable(torch.Tensor(np.array(x_train)))
trainY = Variable(torch.Tensor(np.array(y_train)))
# 訓(xun)練(lian)模(mo)型(xing)
num_epochs = 100
for epoch in range(num_epochs):
    outputs = rnn(trainX)
    optimizer.zero_grad()
    
    # 計算損失
    loss = criterion(outputs, trainY)
    loss.backward()
    
    optimizer.step()
    if epoch % 10 == 0:
        print("Epoch: %d, loss: %1.5f" % (epoch, loss.item()))

這個案例的數據集很小,也不涉(she)及(ji)感(gan)知類(lei)的例如圖片、音頻(pin)或視(shi)頻(pin)之(zhi)類(lei)的,所以(yi)我們直接在CPU上做訓練即可。打印出(chu)來的每一輪的損失為:

Epoch: 0, loss: 0.45516

Epoch: 10, loss: 0.02038

Epoch: 20, loss: 0.00982

Epoch: 30, loss: 0.00167

Epoch: 40, loss: 0.00174

Epoch: 50, loss: 0.00089

Epoch: 60, loss: 0.00058

Epoch: 70, loss: 0.00056

Epoch: 80, loss: 0.00052

Epoch: 90, loss: 0.00049

Step5 測試模型

# 使用訓練好的模型進(jin)行預測
rnn."> 設置模型為評估模式
test_outputs = rnn(testX)
# 將預測(ce)結果逆歸一化(hua)
test_outputs = test_outputs.data.numpy()
test_outputs = Scaler.inverse_transform(test_outputs) # 逆歸一化
# 真實(shi)測(ce)試標簽逆歸(gui)一化
y_test_actual = Scaler.inverse_transform(y_test)
# 輸(shu)出預測和真實結果
for i in range(len(y_test)):
    print(f"Date: {df_app['2020-10-01':].index[i+seq_length]}, Actual Activation: {y_test_actual[i][0]}, Predicted Activation: {test_outputs[i][0]}")

打印出(chu)來的(de)真(zhen)實值 和 預測(ce)值如下:

Date: 2020-10-05 00:00:00, Actual Activation: 923.0, Predicted Activation: 885.0889282226562
Date: 2020-10-06 00:00:00, Actual Activation: 919.0000000000001, Predicted Activation: 893.8333129882812
Date: 2020-10-07 00:00:00, Actual Activation: 915.0, Predicted Activation: 898.3600463867188
Date: 2020-10-08 00:00:00, Actual Activation: 910.0000000000001, Predicted Activation: 896.8088989257812
Date: 2020-10-09 00:00:00, Actual Activation: 905.0000000000001, Predicted Activation: 895.2501220703125
Date: 2020-10-10 00:00:00, Actual Activation: 901.0, Predicted Activation: 891.626953125
Date: 2020-10-11 00:00:00, Actual Activation: 913.0000000000001, Predicted Activation: 888.2245483398438
Date: 2020-10-12 00:00:00, Actual Activation: 900.0, Predicted Activation: 890.2631225585938
Date: 2020-10-13 00:00:00, Actual Activation: 888.0000000000001, Predicted Activation: 885.708984375
Date: 2020-10-14 00:00:00, Actual Activation: 883.0, Predicted Activation: 880.345458984375
Date: 2020-10-15 00:00:00, Actual Activation: 861.0, Predicted Activation: 878.3155517578125
Date: 2020-10-16 00:00:00, Actual Activation: 844.0, Predicted Activation: 865.739013671875
Date: 2020-10-17 00:00:00, Actual Activation: 837.0, Predicted Activation: 853.5955810546875
Date: 2020-10-18 00:00:00, Actual Activation: 841.0, Predicted Activation: 845.1204223632812
Date: 2020-10-19 00:00:00, Actual Activation: 821.0, Predicted Activation: 838.4027709960938
Date: 2020-10-20 00:00:00, Actual Activation: 843.0, Predicted Activation: 826.8444213867188
Date: 2020-10-21 00:00:00, Actual Activation: 857.0, Predicted Activation: 830.8392333984375
Date: 2020-10-22 00:00:00, Actual Activation: 861.0, Predicted Activation: 837.3353881835938
Date: 2020-10-23 00:00:00, Actual Activation: 858.0, Predicted Activation: 838.6307983398438
Date: 2020-10-24 00:00:00, Actual Activation: 832.0, Predicted Activation: 845.0518798828125
Date: 2020-10-25 00:00:00, Actual Activation: 811.0, Predicted Activation: 839.138427734375
Date: 2020-10-26 00:00:00, Actual Activation: 807.0, Predicted Activation: 828.6616821289062
Date: 2020-10-27 00:00:00, Actual Activation: 803.0, Predicted Activation: 820.3754272460938
Date: 2020-10-28 00:00:00, Actual Activation: 821.0, Predicted Activation: 809.3426513671875
Date: 2020-10-29 00:00:00, Actual Activation: 838.0, Predicted Activation: 809.6136474609375
...Date: 2021-01-22 00:00:00, Actual Activation: 925.0000000000001, Predicted Activation: 897.9528198242188
Date: 2021-01-23 00:00:00, Actual Activation: 926.0, Predicted Activation: 898.5119018554688
Date: 2021-01-24 00:00:00, Actual Activation: 920.0, Predicted Activation: 899.7281494140625
Date: 2021-01-25 00:00:00, Actual Activation: 932.0, Predicted Activation: 899.1580200195312

光這樣看不太直觀(guan),繪(hui)制一個對比圖(tu):

# 定義(yi)繪圖函(han)數(shu)
def plot_predictions(test,predicted):
    plt.plot(test, color='red',label='Real Count') #真(zhen)值(zhi)
    plt.plot(predicted, color='blue',label='Predicted Count') #預測值(zhi)
    plt.title('Flower App Activation Prediction') #圖題
    plt.xlabel('Time') #X軸時間
    plt.ylabel('Flower App Activation Count') #Y軸激活(huo)數
    plt.legend() #圖例
    plt.show() #繪(hui)圖
plot_predictions(y_test_actual,test_outputs) #繪圖

繪制出來(lai)的對比圖如下(xia)所示(shi):

可以看到,預測值(zhi)和真(zhen)實(shi)值(zhi)還是(shi)存在一定的差距。

Step6 計算(suan)性(xing)能

這里,我們計算(suan)一下(xia)MSE損失值 和 R平(ping)方(fang)分數(shu):

import math #導入數學函數
from sklearn.metrics import mean_squared_error

def return_rmse(test,predicted): #定義均方損失(shi)函數
    rmse = math.sqrt(mean_squared_error(test, predicted)) #均方損失(shi)
    print("MSE損失值 {}".format(rmse))
return_rmse(y_test_actual, test_outputs)

MSE損失值 25.51237936695477

from sklearn.metrics import r2_score

r2 = r2_score(y_test_actual, test_outputs)
print(f"R2 Score: {r2}")

R2 Score: 0.6570994936886689

小結

本文介紹了RNN循環(huan)神(shen)經網(wang)絡的基本概念 和(he) 各種神(shen)經網(wang)絡(DNN、CNN、RNN)的對比,最后介紹了如何基于RNN來做(zuo)時序預(yu)測(ce)的案例。

推薦學習

黃佳,《AI應(ying)用實戰課(ke)》(課(ke)程(cheng))

黃佳,《圖解(jie)GPT:大模型是如(ru)何構建的》(圖書)

黃佳,《動(dong)手(shou)做AI Agent》(圖(tu)書)

 

posted @ 2025-02-26 08:30  EdisonZhou  閱讀(285)  評論(0)    收藏  舉報