?引言
? ? ? ?密集連接網(wǎng)絡(luò)和卷積神經(jīng)網(wǎng)絡(luò)都有主要的特點(diǎn),那就是它們沒有記憶。它們單獨(dú)處理每個(gè)輸入,在輸入和輸入之間沒有保存任何狀態(tài)。舉個(gè)例子:當(dāng)你在閱讀一個(gè)句子的時(shí)候,你需要記住之前的內(nèi)容,我們才能動(dòng)態(tài)的了解這個(gè)句子想表達(dá)的含義。生物智能已漸進(jìn)的方式處理信息,同時(shí)保存一個(gè)關(guān)于所處理內(nèi)容的內(nèi)部模型,此模型是根據(jù)過去額信息構(gòu)建的,并隨著新的信息進(jìn)入不斷更新。比如股票預(yù)測(cè)、氣溫預(yù)測(cè)等等。
一、mlp和RNN結(jié)構(gòu)
? ? ??? ? ? ? ? ? ?
?RNN特點(diǎn):前部序列的信息經(jīng)處理后,作為輸入信息傳遞后部序列。
手寫一下啦,本博主有點(diǎn)懶,懂了就闊以啦!?肯定權(quán)重是一樣的。
二、不同的RNN結(jié)構(gòu)
(1)多輸入多輸出,維度相同RNN結(jié)構(gòu)
? ? ? ?應(yīng)用:特定信息識(shí)別
結(jié)構(gòu)如圖:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
(2)多輸入單輸出
? ? ? ? ?應(yīng)用:情感識(shí)別
? ? ? ? ? 舉例:I feel very happy.
? ? ? ? ? 判斷:positive
結(jié)構(gòu)如圖:
(3)單輸入多輸出
? ? ? ? ?應(yīng)用:序列數(shù)據(jù)生成
? ? ? ? ?舉例:文章生成(輸入標(biāo)題直接出文章)
?結(jié)構(gòu)如圖:
(4)多輸入多輸出(ij)
? ? ? ? 應(yīng)用:語言翻譯
? ? ? ? 舉例:what is artificial intelligence?
? ? ? ? 什么是人工智能?
?結(jié)構(gòu)如圖:
?介紹了常見的RNN結(jié)構(gòu)。但是這些結(jié)構(gòu)在當(dāng)前部序列信息在傳遞到后部的同時(shí),信息權(quán)重下降,導(dǎo)致重要信息丟失。也稱為(梯度消失)。由于這個(gè)問題接下來提出了長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)。
三、長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)
? ? ? ?? ? ? ? ? ? ? ? ? ? ?
通過傳遞前部序列信息,距離越遠(yuǎn)信息丟失越多(從彩色圖可以很好的體現(xiàn))。
?增加記憶細(xì)胞
,可以傳遞前部遠(yuǎn)處部位信息,且在傳遞過程中信息丟失少。
內(nèi)部結(jié)構(gòu):
?忘記門:選擇性丟棄
與?中不重要的信息。
更新門:確定給記憶細(xì)胞添加哪些信息。
輸出門:篩選需要輸出的信息。
?結(jié)構(gòu)如圖:
?在網(wǎng)絡(luò)結(jié)構(gòu)很深(很多層)的情況下,也能保留保留重要的信息;
解決了普通RNN求解過程中的梯度消失問題。
四、溫度預(yù)測(cè)問題——神經(jīng)網(wǎng)絡(luò)基于GUR
數(shù)據(jù)集介紹:
?除了語言處理,其他許多問題中也都用到了序列數(shù)據(jù)。溫度預(yù)測(cè)數(shù)據(jù)集,每十分鐘記錄14分不同的量(比如氣溫、氣壓、濕度、風(fēng)向等)我們將利用2009-2016年的數(shù)據(jù)集構(gòu)建模型,輸入最近數(shù)據(jù),預(yù)測(cè)24小時(shí)之后的氣溫。???????
(一)讀入數(shù)據(jù)兩種方式介紹:
(1)dataframe格式:
注意:
Initializing from file failed
由于文件中存在中文所以加后面engine='python'
data1=pd.read_csv('/data/jena_climate_2009_2016.csv',engine='python')
后續(xù)簡(jiǎn)單操作代碼如下:轉(zhuǎn)化成數(shù)組
data=data1.copy()
df=data.values
data=df[:,1:]
data
data = np.array(data, dtype=np.float64)#方便后面數(shù)據(jù)標(biāo)準(zhǔn)化
(2)str格式:
import os
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
data_dir='/data'
fname=os.path.join(data_dir,'jena_climate_2009_2016.csv')
f=open(fname)
data=f.read()
f.close()
lines=data.split('\n')
header=lines[0].split(',')
header
?后續(xù)簡(jiǎn)單操作代碼如下:轉(zhuǎn)化成數(shù)組
float_data=np.zeros((len(lines),len(header)-1))
for i,line in enumerate(lines):
values=[float(x) for x in line.split(',')[1:]]
float_data[i,:]=values
結(jié)果如圖:
補(bǔ)充 :enumerate()函數(shù)
英語翻譯:就是枚舉
names = ["Alice","Bob","Carl"]
for index,value in enumerate(names):
? ? print(f'{index}: {value}')
?看結(jié)果就懂了:
0: Alice 1: Bob 2: Carl
(二)分析數(shù)據(jù),數(shù)據(jù)可視化?
from matplotlib import pyplot as plt
temp=data[:,1]
plt.plot(range(len(temp)),temp)#可以看出每年溫度的周期性變化
#看完整體看局部前十天的溫度變化
#首先呢每十分鐘記錄一個(gè)數(shù)據(jù)點(diǎn),一天則可以記錄144個(gè)數(shù)據(jù)點(diǎn),則十天記錄1440個(gè)數(shù)據(jù)點(diǎn)
plt.plot(range(1440),temp[:1440])#后面是冬季
結(jié)果如圖:
? ??
?(三)處理數(shù)據(jù),可以輸入RNN模型
(1)?首先數(shù)據(jù)預(yù)處理(將數(shù)據(jù)處理為神經(jīng)網(wǎng)絡(luò)可以處理的格式,由于已經(jīng)是數(shù)值型的,所以不需要向量化)。
但是由于數(shù)據(jù)每個(gè)時(shí)間序列位于不同的范圍所以我們需要對(duì)每個(gè)時(shí)間序列進(jìn)行標(biāo)準(zhǔn)化,讓他們?cè)谙嗨品秶鷥?nèi)都取較小的值。
我們采取200 000個(gè)時(shí)間作為訓(xùn)練數(shù)據(jù)。
mean=data[:200000].mean(axis=0)
print(mean)
std=data[:200000].std(axis=0)
print(std)
data_-=mean
data_/=std
?(2)提取序列數(shù)據(jù)
首先介紹Input_shape=(samples,time_steps,features)
舉個(gè)例子:比如700個(gè)數(shù)據(jù),我用8個(gè)數(shù)據(jù)去預(yù)測(cè)第九個(gè)數(shù)據(jù):
[1 , 2 , . . . ,8]? ? ? ----9? ?——
[2 , 3 , . . . ,9]? ? ? ----10 ——
[3 , 4 , . . . ,10]
.?
.?
.
and so on。? ? ? ? ? ? ? ? ? ?——?n 代表samples? ? ?
time_steps=8
features:樣本特征維數(shù)(自然語言處理十分重要 one-hot格式比如001對(duì)應(yīng)三),這里數(shù)據(jù)是單維度則為1.
def extract_data(data,time_step):
X=[]
y=[]
#0,1,2,3...,9:10個(gè)樣本;time_step=8;0,1...7;2,3...8兩個(gè)樣本
for i in range(len(data)-time_step):
X.append([a for a in data[i:i+time_step]])
y.append(data[i+time_step])
X=np.array(X)
#X=X.reshape(X.shape[0],X.shape[1],1)
return X,y
五、單層lstm股票預(yù)測(cè)?
?(一)導(dǎo)包讀入數(shù)據(jù)
%matplotlib inline
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負(fù)號(hào)
data_=pd.read_csv('/data/zgpa.csv',engine='python')
data_.head()
(二)數(shù)據(jù)預(yù)處理?
close=np.array(close,dtype=np.float64)
mean=close.mean(axis=0)
print(mean)
std=close.std(axis=0)
print(std)
close-=mean
close/=std
(三)時(shí)間序列數(shù)據(jù)可視化
#首先我們看一下收盤價(jià)格時(shí)間序列的趨勢(shì)
close=data_['close']
close
plt.plot(range(len(close)),close)
plt.title('close price')
結(jié)果如圖:
(四)提取序列數(shù)據(jù)與上面一樣略
調(diào)用:
X,y=extract_data(close,time_step)
print(X[0,:,:])
print(y)
(五)建立單個(gè)LSTM模型
from keras.models import Sequential
from keras.layers import Dense,SimpleRNN
model=Sequential()
#add rnn layer
model.add(SimpleRNN(units=8,input_shape=(time_step,1),activation='relu'))
#add output layer
model.add(Dense(units=1,activation='linear'))
#configure the model
model.compile(optimizer='adam',loss='mean_squared_error')
model.summary()
結(jié)果如圖:
?(六)訓(xùn)練模型
y=np.array(y)
model.fit(X,y,batch_size=30,epochs=200)
結(jié)果如圖:
?(七)預(yù)測(cè)與真實(shí)可視化
y_train_predict=(model.predict(X)*std)+mean
y_train=(y*std)+mean
fig1=plt.figure(figsize=(8,5))
plt.plot(y_train,label='real price')
plt.plot(y_train_predict,label='predict price')
plt.title('close price')
plt.xlabel('time')
plt.ylabel('price')
plt.legend()
plt.show()
結(jié)果如圖:文章來源:http://www.zghlxwxcb.cn/news/detail-423123.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-423123.html
到了這里,關(guān)于【深度學(xué)習(xí)】——循環(huán)神經(jīng)網(wǎng)絡(luò)RNN及實(shí)例氣溫預(yù)測(cè)、單層lstm股票預(yù)測(cè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!