天天看點

【深度學習論文翻譯】基于LSTM深度神經網絡的時間序列預測(Time Series Prediction Using LSTM Deep Neural Networks)

目錄

一、前言

二、摘要

三、什麼是LSTM神經元?

四、簡單正弦波示例

五、 不那麼簡單的股票市場

六、多元LSTM預測

七、結論

一、前言

最近需要用到時間序列,在網上也找到了一篇相關的文章及源代碼,在此分享給大家。

1.文章原文:https://www.altumintelligence.com/articles/a/Time-Series-Prediction-Using-LSTM-Deep-Neural-Networks

2.源碼網址:https://github.com/jaungiers/LSTM-Neural-Network-for-Time-Series-Prediction

3.本文中涉及到一個概念叫超參數,這裡有有關超參數的介紹(https://blog.csdn.net/shuiyixin/article/details/88996743)

4.運作代碼可能會報錯:Using TensorFlow backend.解決方案點選:https://blog.csdn.net/shuiyixin/article/details/88928354

如果你還有什麼問題,希望跟我能夠一起交流,除了通過部落格交流外,歡迎你加入我的QQ群,一起交流有關于機器學習、深度學習、計算機視覺有關内容。目前我并未确定具體的研究方向,是以現在 處于廣泛涉獵階段,希望我們能夠一起溝通。下圖是我的群二維碼:

為了友善交流學習,我寫論文翻譯都會将論文原文中的某段放到論文中,友善大家與譯文對應。有些内容如果不是論文原文,我會用不同顔色标注,友善大家區分。

本篇文章是有關于時間序列預測的,該部落格翻譯内容介紹如下:

1.摘要:通過摘要,我們能夠對該技術總體有個大緻的了解,知道這篇文章做了什麼,有哪些要求以及代碼下載下傳。

2.LSTM神經元:通過這一部分,我們能對LSTM神經元有一些基礎了解但是該文章不是講解LSTM原理,而是其應用,是以這部分隻是簡單介紹其基本概念以及為什麼引入LSTM。

3.簡單正弦波:通過一個正弦波序列來幫助大家了解LSTM網絡。

4.股票市場:利用股票資料進行預測操作。

5.多元LSTM預測:通過不同次元對股票進行預測。

接下來就讓我們一起了解一下這篇論文,跟随這篇論文一起走進LSTM的世界吧!

二、摘要

本文重點介紹如何使用深度LSTM神經網絡架構提供多元時間序列預測,使用Keras和Tensorflow - 特别是在股票市場資料集上-提供股票價格的動量名額。

這個架構的代碼可以在下面的GitHub repo中找到(我們假設你電腦上滿足python版本3.5.x和requirements.txt檔案中的需求版本。偏離這些版本可能會導緻錯誤):https://github.com/jaungiers/LSTM-Neural-Network-for-Time-Series-Prediction

注:需求版本如下:

numpy==1.15.0

pandas==0.23.3

tensorflow-gpu==1.10.0

keras==2.2.2

matplotlib==2.2.2

以下文章部分将簡要介紹LSTM神經元細胞,給出一個預測正弦波的虛拟示例,然後通過應用程式進入随機時間序列。本文假設了簡單深度神經網絡的基本工作知識。

三、什麼是LSTM神經元?

長期困擾傳統神經網絡架構的基本問題之一是解釋互相依賴的資訊和上下文輸入序列的能力。該資訊可以是句子中的先前單詞,以允許上下文預測下一個單詞可能是什麼,或者它可以是序列的時間資訊,允許該序列的基于時間的元素的上下文。

簡而言之,傳統的神經網絡每次都會采用獨立的資料向量,并且在需要存儲的任務中,沒有記憶體概念來幫助他們。

解決這個問題的早期嘗試是對網絡中的神經元使用簡單的回報類型方法,其中輸出被回報到輸入中,用以提供最後可見的輸入的上下文。這些被稱為遞歸神經網絡(RNN)。雖然這些RNN在一定程度上起作用,但是它們有相當大的下降,它們的任何重大用途都會導緻稱為消失梯度問題的問題。我們不會進一步擴充消失梯度問題,而是說由于這個問題導緻RNN不适合大多數現實問題,是以,需要找到另一種解決上下文存儲的方法。

這是長期短期記憶(LSTM)神經網絡拯救的地方。與RNN神經元一樣,LSTM神經元在其管道中保持記憶的上下文,以允許解決順序和時間問題,而不會消除影響其性能的消失梯度。

許多研究論文和文章都可以在網上找到,它們在很好的數學細節上讨論了LSTM神經元的工作原理。然而,在本文中,我們不會讨論LSTM的複雜工作原理,因為我們更關心它們對我們問題的使用。

對于上下文,下面是LSTM神經元的典型内部工作圖。它由若幹層和逐點操作組成,這些操作充當資料輸入,輸出和遺忘的門,為LSTM單元狀态提供資訊。這種單元狀态是保持網絡和輸入的長期記憶和上下文的原因。

四、簡單正弦波示例

為了示範LSTM神經網絡在預測時間序列中的使用,讓我們從我們能想到的最基本的事情開始:一個時間序列:可信的正弦波。讓我們建立資料,我們将需要為這個函數建造許多震蕩,以便LSTM網絡進行訓練。

代碼資料檔案夾中提供的資料包含我們建立的sinewave.csv檔案,該檔案包含5001個正弦波時間段,幅度和頻率為1(角頻率為6.28),時間內插補點為0.01。繪制時的結果如下所示:

資料集為正弦波

現在我們有了資料,我們實際上想要實作什麼?好吧,我們隻是希望LSTM從我們将提供的資料的設定視窗大小中學習正弦波,并且希望我們可以要求LSTM預測該系列中的後面N個步驟,并且它将繼續輸出正弦波。

我們将首先将CSV檔案中的資料轉換并加載到pandas資料幀中,然後将其用于輸出将為LSTM提供資料的numpy數組。Keras LSTM層的工作方式是采用3維(N,W,F)的numpy數組,其中N是訓練序列的數量,W是序列長度,F是每個序列的特征數。我們選擇使用允許網絡的序列長度(讀取視窗大小)為50,可以看到每個序列的正弦波形狀,是以希望自主學習建立一個基于先前接收到的視窗的序列模式。

序列本身是滑動視窗,是以每次移動1,導緻與先前視窗的不斷重疊。當繪制時,序列長度為50的典型訓練視窗如下所示:

Sinewave資料集教育訓練視窗

為了加載這些資料,我們在代碼中建立了一個DataLoader類,以便為資料加載層提供抽象資料。您會注意到,在初始化DataLoader對象時,會傳入檔案名,以及确定用于訓練與測試的資料百分比的拆分變量以及允許選擇一列或多列資料的列變量用于單維或多元分析。

class DataLoader():

    def __init__(self, filename, split, cols):

        dataframe = pd.read_csv(filename)

        i_split = int(len(dataframe) * split)

        self.data_train = dataframe.get(cols).values[:i_split]

        self.data_test  = dataframe.get(cols).values[i_split:]

        self.len_train  = len(self.data_train)

        self.len_test   = len(self.data_test)

        self.len_train_windows = None

    def get_train_data(self, seq_len, normalise):

        data_x = []

        data_y = []

        for i in range(self.len_train - seq_len):

            x, y = self._next_window(i, seq_len, normalise)

            data_x.append(x)

            data_y.append(y)

        return np.array(data_x), np.array(data_y)

注:

1.上面的代碼在core檔案夾下的data_processor.py檔案中。

2.隻有上面的代碼是會報錯的,因為,Python不知道什麼是pd,不知道什麼是np。你需要在前面引入幾個包:

import numpy as np

import pandas as pd

在我們有一個允許我們加載資料的資料對象之後,我們需要建構深度神經網絡模型。同樣,為了抽象化,我們的代碼架構在config.json檔案的旁邊使用一個Model類,在給定所需的體系結構和存儲在配置檔案中的超參數的情況下,輕松構模組化型的執行個體。建構我們網絡主要功能的是build_model()函數,它接收解析的配置檔案。

注:hyperparameters(超參數)介紹:https://blog.csdn.net/shuiyixin/article/details/88996743

此功能代碼如下所示,并且可以輕松擴充,以便将來在更複雜的架構上使用。

class Model():

    def __init__(self):

        self.model = Sequential()

    def build_model(self, configs):

        timer = Timer()

        timer.start()

        for layer in configs['model']['layers']:

            neurons = layer['neurons'] if 'neurons' in layer else None

            dropout_rate = layer['rate'] if 'rate' in layer else None

            activation = layer['activation'] if 'activation' in layer else None

            return_seq = layer['return_seq'] if 'return_seq' in layer else None

            input_timesteps = layer['input_timesteps'] if 'input_timesteps' in layer else None

            input_dim = layer['input_dim'] if 'input_dim' in layer else None

            if layer['type'] == 'dense':

                self.model.add(Dense(neurons, activation=activation))

            if layer['type'] == 'lstm':

                self.model.add(LSTM(neurons, input_shape=(input_timesteps, input_dim), return_sequences=return_seq))

            if layer['type'] == 'dropout':

                self.model.add(Dropout(dropout_rate))

        self.model.compile(loss=configs['model']['loss'], optimizer=configs['model']['optimizer'])

        print('[Model] Model Compiled')

        timer.stop()

注:

1.上面的代碼在core檔案夾下的model.py檔案中。

2.隻有上面的代碼是會報錯的,你需要在前面引入幾個包:

from core.utils import Timer

from keras.layers import Dense,  Dropout, LSTM

from keras.models import Sequential

加載資料并建立模型後,我們現在可以繼續使用我們的訓練資料訓練模型。為此,我們建立了一個單獨的運作子產品,它将利用我們的Model.py和DataLoader.py抽象,将它們組合起來進行訓練,輸出和可視化。

下面是訓練我們模型的一般運作線程代碼。

configs = json.load(open('config.json', 'r'))

data = DataLoader(

    os.path.join('data', configs['data']['filename']),

    configs['data']['train_test_split'],

    configs['data']['columns']

)

model = Model()

model.build_model(configs)

x, y = data.get_train_data(

    seq_len = configs['data']['sequence_length'],

    normalise = configs['data']['normalise']

)

model.train(

    x,

    y,

    epochs = configs['training']['epochs'],

    batch_size = configs['training']['batch_size']

)

x_test, y_test = data.get_test_data(

    seq_len = configs['data']['sequence_length'],

    normalise = configs['data']['normalise']

)

注:

1.上面的代碼在主檔案夾下的run.py檔案中,但是代碼有一些不同,大家可以自己建立一個Python檔案測試代碼。

2.隻有上面的代碼是會報錯的,你需要在前面引入幾個包:

import os

import json  #json檔案操作

from core.data_processor import DataLoader

from core.model import Model

對于輸出,我們将運作兩種類型的預測:第一種将以逐點方式進行預測,即我們每次僅預測單個點,将此點繪制為預測,然後沿着下一個視窗進行預測使用完整的測試資料并再次預測下一個點。

我們要做的第二個預測是預測一個完整的序列(全序列預測),我們隻用訓練資料的第一部分初始化一次訓練視窗。然後模型預測下一個點,我們移動視窗,就像逐點方法一樣。不同之處在于我們使用我們在先前預測中預測的資料來預測。在第二步中,這意味着隻有一個資料點(最後一個點)來自先前的預測。在第三個預測中,最後兩個資料點将來自先前的預測,依此類推。經過50次預測後,我們的模型将随後根據自己的先前預測進行預測。這使我們可以使用該模型預測未來的許多時間步驟,但正如它預測的那樣,這些預測反過來又可以基于預測,這将增加我們預測的未來預測的錯誤率。

下面我們可以看到逐點預測和完整序列預測的代碼和相應的輸出。

正弦波逐點預測

正弦波全序列預測

作為參考,可以在下面的配置檔案中看到用于正弦波示例的網絡架構和超參數。

{

    "data": {

        "filename": "sinewave.csv",

        "columns": [

            "sinewave"

        ],

        "sequence_length": 50,

        "train_test_split": 0.8,

        "normalise": false

    },

    "training": {

        "epochs": 2,

        "batch_size": 32

    },

    "model": {

        "loss": "mse",

        "optimizer": "adam",

        "layers": [

            {

                "type": "lstm",

                "neurons": 50,

                "input_timesteps": 49,

                "input_dim": 1,

                "return_seq": true

            },

            {

                "type": "dropout",

                "rate": 0.05

            },

            {

                "type": "lstm",

                "neurons": 100,

                "return_seq": false

            },

            {

                "type": "dropout",

                "rate": 0.05

            },

            {

                "type": "dense",

                "neurons": 1,

                "activation": "linear"

            }

        ]

    }

}

注:因為要多次用到,建議大家建立一個json檔案,專用與正弦波。

基于真實資料我們可以看到,隻在1個時期和相當小的訓練資料集中,LSTM深度神經網絡已經在預測正弦函數方面做得非常好。

您可以看到,随着我們對未來越來越多的預測,誤差幅度會随着先前預測中的誤差在用于未來預測時被越來越多地放大而增加。是以,我們看到在完整序列示例中,預測值與真實值相差未來越遠,我們預測預測的頻率和幅度與真實資料相比就越不準确。然而,由于sin函數是一個非常簡易的振蕩函數,并且沒有噪聲,它仍然可以在不過度拟合的情況下很好地預測它 - 這很重要,因為我們可以通過增加時期和取出dropout層(防止過拟合)來輕松地過度拟合模型這個訓練資料幾乎完全準确,與測試資料的模式相同,但是,對于其他真實的世界的案例來說,如果模型與教育訓練資料不一緻,那麼,試驗就不會一般化。

在下一步中,我們将嘗試在此類真實資料上使用該模型來檢視效果。

五、 不那麼簡單的股票市場

我們在精确的逐點基礎上預測了幾百個正弦波的步長。是以,我們現在可以在股票市場時間序列中做同樣的事情并立即獲利,對嗎?不幸的是,在現實世界中,這并不是那麼簡單。

與正弦波不同,股票市場時間序列不是可以映射的任何特定靜态函數。描述股票市場時間序列運動的最佳屬性是随機走向。作為随機過程,真正的随機走向沒有可預測的模式,是以嘗試對其進行模組化将毫無意義。幸運的是,許多方面都在持續争論說股票市場不是一個純粹的随機過程,這使我們能夠了解時間序列可能具有某種隐藏模式。正是這些隐藏的模式,LSTM深度網絡是預測的主要候選者。

此示例将使用的資料是data檔案夾中的sp500.csv檔案。此檔案包含2000年1月至2018年9月标準普爾500股票指數的開盤價,最高價,最低價,收盤價以及每日交易量。

在第一個執行個體中,我們将僅使用Close price建立單維模型。調整config.json檔案以反映新資料,我們将保持大部分參數相同。然而,需要做出的一個改變是,與僅具有介于-1到+1之間的數值範圍的正弦波不同,收盤價是股票市場不斷變化的絕對價格。這意味着如果我們試圖在不對其進行标準化的情況下訓練模型,它就永遠不會收斂。

為了解決這個問題,我們将采用每個n大小的訓練/測試資料視窗并對每個視窗進行标準化以反映從該視窗開始的百分比變化(是以點i = 0處的資料将始終為0)。我們将使用以下等式進行歸一化,然後在預測過程結束時進行去标準化,以獲得預測中的真實世界數:

n =價格變化的标準化清單[視窗] 

p =調整後的每日回報價格的原始清單[視窗]

我們已将normalise_windows()函數添加到DataLoader類以執行此轉換,并且配置檔案中包含布爾規範化标志,表示這些視窗的規範化。

def normalise_windows(self, window_data, single_window=False):

    '''Normalise window with a base value of zero'''

    normalised_data = []

    window_data = [window_data] if single_window else window_data

    for window in window_data:

        normalised_window = []

        for col_i in range(window.shape[1]):

            normalised_col = [((float(p) / float(window[0, col_i])) - 1) for p in window[:, col_i]]

            normalised_window.append(normalised_col)

                # reshape and transpose array back into original multidimensional format

        normalised_window = np.array(normalised_window).T                

        normalised_data.append(normalised_window)

    return np.array(normalised_data)

注:

1.上面的代碼在core檔案夾下的data_processor.py檔案中。

2.隻有上面的代碼是會報錯的,因為,Python不知道什麼是pd,不知道什麼是np。你需要在前面引入幾個包:

import numpy as np

import pandas as pd

随着Windows規範化,我們現在可以運作模型,就像我們運作它來對抗正弦波資料一樣。然而,我們在運作這些資料時做了一個重要的改變; 而不是使用我們架構的model.train()方法,而是使用我們建立的model.train_generator()方法。我們這樣做是因為我們發現在嘗試訓練大型資料集時很容易耗盡記憶體,因為model.train()函數将完整資料集加載到記憶體中,然後将規範化應用于記憶體中的每個視窗,容易導緻記憶體溢出。是以,我們使用了Keras的fit_generator()函數,允許使用python生成器動态訓練資料集來繪制資料,這意味着記憶體使用率将大大降低。

configs = json.load(open('config.json', 'r'))

data = DataLoader(

    os.path.join('data', configs['data']['filename']),

    configs['data']['train_test_split'],

    configs['data']['columns']

)

model = Model()

model.build_model(configs)

x, y = data.get_train_data(

    seq_len = configs['data']['sequence_length'],

    normalise = configs['data']['normalise']

)

# out-of memory generative training

steps_per_epoch = math.ceil((data.len_train - configs['data']['sequence_length']) / configs['training']['batch_size'])

model.train_generator(

    data_gen = data.generate_train_batch(

        seq_len = configs['data']['sequence_length'],

        batch_size = configs['training']['batch_size'],

        normalise = configs['data']['normalise']

    ),

    epochs = configs['training']['epochs'],

    batch_size = configs['training']['batch_size'],

    steps_per_epoch = steps_per_epoch

)

x_test, y_test = data.get_test_data(

    seq_len = configs['data']['sequence_length'],

    normalise = configs['data']['normalise']

)

predictions_multiseq = model.predict_sequences_multiple(x_test, configs['data']['sequence_length'], configs['data']['sequence_length'])

predictions_fullseq = model.predict_sequence_full(x_test, configs['data']['sequence_length'])

predictions_pointbypoint = model.predict_point_by_point(x_test)        

plot_results_multiple(predictions_multiseq, y_test, configs['data']['sequence_length'])

plot_results(predictions_fullseq, y_test)

plot_results(predictions_pointbypoint, y_test)

注:

1.上面的代碼在主檔案夾下的run.py檔案中,但是代碼有一些不同,大家可以自己建立一個Python檔案測試代碼。

2.config.json檔案内容如下:

{

    "data": {

        "filename": "sp500.csv",

        "columns": [

            "Close"

        ],

        "sequence_length": 50,

        "train_test_split": 0.85,

        "normalise": true

    },

    "training": {

        "epochs": 1,

        "batch_size": 32

    },

    "model": {

        "loss": "mse",

        "optimizer": "adam",

        "layers": [

            {

                "type": "lstm",

                "neurons": 100,

                "input_timesteps": 49,

                "input_dim": 1,

                "return_seq": true

            },

            {

                "type": "dropout",

                "rate": 0.2

            },

            {

                "type": "lstm",

                "neurons": 100,

                "return_seq": true

            },

            {

                "type": "lstm",

                "neurons": 100,

                "return_seq": false

            },

            {

                "type": "dropout",

                "rate": 0.2

            },

            {

                "type": "dense",

                "neurons": 1,

                "activation": "linear"

            }

        ]

    }

}

如上所述,在單個逐點預測上運作資料可以非常接近地比對傳回的内容。但這有點欺騙性。經過仔細檢查,預測線由奇異的預測點組成,這些預測點在它們後面具有整個先前的真實曆史視窗。是以,網絡不需要了解時間序列本身,除了每個下一個點很可能不會離最後一點太遠。是以,即使它得到錯誤點的預測,下一個預測也會考慮真實曆史并忽略不正确的預測,但又會允許發生錯誤。

雖然這對于下一個價格點的精确預測最初可能聽起來并不樂觀,但它确實有一些重要的用途。雖然它不知道确切的下一個價格是多少,但它确實能夠準确地表示下一個價格的範圍。

此資訊可用于波動率預測等應用程式(能夠預測市場中高波動率或低波動率的時段對于特定交易政策可能非常有利),或者遠離交易這也可以用作良好名額用于異常檢測。異常檢測可以通過預測下一個點,然後将其與真實資料進行比較來實作,如果真實資料值與預測點明顯不同,則可以針對該資料點提出異常标記。

S&P500逐點預測

繼續進行全序列預測,似乎這被證明是對這種類型的時間序列用處最小的預測(至少在這個超參數的訓練模型上)。我們可以看到預測開始時的輕微碰撞,其中模型遵循某種類型的動量,但是很快我們可以看到模型确定最佳模式是收斂到時間序列的某個均衡。在這個階段,這可能看起來并沒有提供太多價值,但是平均回歸交易者可能會在那裡宣稱該模型隻是找到價格序列在波動率被消除時将恢複的平均值。

S&P500全序列預測

最後,我們對該模型進行了第三種預測,我将其稱為多序列預測。這是完整序列預測的混合,因為它仍然使用測試資料初始化測試視窗,預測下一個點,然後使用下一個點建立一個新視窗。但是,一旦它到達輸入視窗完全由過去預測組成的點,它就會停止,向前移動一個完整的視窗長度,用真實的測試資料重置視窗,然後再次啟動該過程。實質上,這給出了對測試資料的多個趨勢線預測,以便能夠分析模型能夠獲得未來動量趨勢的程度。

S&P500多序列預測

我們可以從多序列預測中看出,網絡似乎正确地預測了絕大多數時間序列的趨勢(和趨勢幅度)。雖然不完美,但它确實表明了LSTM深度神經網絡在順序和時間序列問題中的有用性。通過仔細的超參數調整,肯定可以實作更高的準确性。

六、多元LSTM預測

到目前為止,我們的模型僅采用單維輸入(在我們的S&P500資料集的情況下為“Close(收盤)”價格)。但是對于更複雜的資料集,序列自然存在許多不同的次元,可用于增強資料集,進而提高模型的準确性。

對于我們的S&P500資料集,我們可以看到我們有五個可能的次元,包括Open(開盤),High(最高),Low(最低),Close(收盤)和Volume(交易量)。我們開發的架構允許使用多元輸入資料集,是以我們需要做的就是編輯列并适當地設定第一層input_dim值以運作我們的模型。在這種情況下,我将使用兩個次元運作模型: “Close(收盤)”和“Volume(交易量)”。

為了示範LSTM神經網絡在預測時間序列中的使用,讓我們從我們能想到的最基本的事情開始:一個時間序列:可信的正弦波。讓我們建立資料,我們将需要為這個函數建造許多震蕩,以便LSTM網絡進行訓練。

{

    "data": {

        "filename": "sp500.csv",

        "columns": [

            "Close",

            "Volume"

        ],

        "sequence_length": 50,

        "train_test_split": 0.85,

        "normalise": true

    },

    "training": {

        "epochs": 1,

        "batch_size": 32

    },

    "model": {

        "loss": "mse",

        "optimizer": "adam",

        "layers": [

            {

                "type": "lstm",

                "neurons": 100,

                "input_timesteps": 49,

                "input_dim": 2,

                "return_seq": true

            },

            {

                "type": "dropout",

                "rate": 0.2

            },

            {

                "type": "lstm",

                "neurons": 100,

                "return_seq": true

            },

            {

                "type": "lstm",

                "neurons": 100,

                "return_seq": false

            },

            {

                "type": "dropout",

                "rate": 0.2

            },

            {

                "type": "dense",

                "neurons": 1,

                "activation": "linear"

            }

        ]

    }

}

使用“Close(收盤)”和“Volume(交易量)”的S&P500多元多序列預測

我們可以看到第二個“交易量”次元與“收盤”一起添加,輸出預測變得更加細化。預測趨勢線似乎更準确地預測即将到來的小幅下跌,不僅是從一開始的主流趨勢,趨勢線的準确性似乎也在這種特殊情況下得到改善。

七、結論

雖然本文的目的是在實踐中給出LSTM深度神經網絡的一個工作執行個體,但它隻是觸及了它們在順序和時間問題中的潛力和應用的表面。

截至撰寫本文時,LSTM已成功應用于衆多現實問題,從此處所述的經典時間序列問題到文本自動糾正,異常檢測和欺詐檢測,以及正在開發的自動駕駛汽車技術的核心。

目前使用上述香草LSTM存在一些局限性,特别是在使用金融時間序列時,該系列本身具有很難模組化的非平穩特性(盡管使用貝葉斯深度神經網絡方法已經取得了進展)解決時間序列的非平穩性)。同樣對于一些應用,還發現基于注意力的神經網絡機制的新進展已經超過LSTM(并且LSTM與這些基于注意力的機制相結合已經超出了它們自身)。

然而,截至目前,LSTM在更經典的統計時間序列方法上提供了顯着的進步,能夠非線性地模組化關系并且能夠以非線性方式處理具有多個次元的資料。

我們開發的架構的完整源代碼可以在以下GitHub頁面上的MIT許可證下找到(我們要求信用證明顯示為“Jakob Aungiers,Altum Intelligence ltd”,無論此代碼在何處重複使用):https://github.com/jaungiers/LSTM-Neural-Network-for-Time-Series-Prediction

————————————————

版權聲明:本文為CSDN部落客「水亦心」的原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/shuiyixin/article/details/88940952

繼續閱讀