神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí) 課件 第7章-循環(huán)神經(jīng)網(wǎng)絡(luò)_第1頁
神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí) 課件 第7章-循環(huán)神經(jīng)網(wǎng)絡(luò)_第2頁
神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí) 課件 第7章-循環(huán)神經(jīng)網(wǎng)絡(luò)_第3頁
神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí) 課件 第7章-循環(huán)神經(jīng)網(wǎng)絡(luò)_第4頁
神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí) 課件 第7章-循環(huán)神經(jīng)網(wǎng)絡(luò)_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)第7章循環(huán)神經(jīng)網(wǎng)絡(luò)7.1循環(huán)神經(jīng)網(wǎng)絡(luò)7.1.1序列數(shù)據(jù)7.1.2循環(huán)神經(jīng)網(wǎng)絡(luò)7.1.3循環(huán)神經(jīng)網(wǎng)絡(luò)的分類7.1.4隨時間反向傳播算法7.2利用循環(huán)神經(jīng)網(wǎng)絡(luò)實現(xiàn)文本分類7.3長短期記憶網(wǎng)絡(luò)7.3.1長程依賴7.3.2長短期記憶網(wǎng)絡(luò)7.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格7.1循環(huán)神經(jīng)網(wǎng)絡(luò)序列數(shù)據(jù)序列數(shù)據(jù)(seriesdata),樣本之間往往并非獨立的,存在一定的相關(guān)性。帶時間戳的就是時間序列數(shù)據(jù)(timeseriesdata),或者簡稱為時間序列其中每個樣本都和特定的時間戳對應(yīng)。通常是在相等間隔的時間段內(nèi)依照給定的采樣頻率對某種潛在過程進行觀測的結(jié)果。反映了某一事物、現(xiàn)象等隨時間變化的狀態(tài)或趨勢,往往被用于變化趨勢的展示和預(yù)測。7.1循環(huán)神經(jīng)網(wǎng)絡(luò)序列數(shù)據(jù)序列數(shù)據(jù)(seriesdata),樣本之間往往并非獨立的,存在一定的相關(guān)性。帶時間戳的就是時間序列數(shù)據(jù)(timeseriesdata日期1/11/21/31/41/51/61/71/81/91/10…溫度(℃)15.9118.517.1118.718.3819.3114.715.6814.5712.11…濕度(%)85.8677.2281.8870.0574.9479.3195.8383.5280.871.94…7.1循環(huán)神經(jīng)網(wǎng)絡(luò)序列數(shù)據(jù)序列數(shù)據(jù)(seriesdata),樣本之間往往并非獨立的,存在一定的相關(guān)性。不帶時間戳的序列數(shù)據(jù)內(nèi)部遵循嚴(yán)格的順序關(guān)系;因此可以認(rèn)為序列的起始樣本的時間戳為0,而序列中任意一個樣本的時間戳就是它距離起始樣本的相對位置。人工神經(jīng)網(wǎng)絡(luò)是一種重要的機器學(xué)習(xí)模型。Artificialneuralnetworkisanimportantmachinelearningmodel.7.1循環(huán)神經(jīng)網(wǎng)絡(luò)循環(huán)神經(jīng)網(wǎng)絡(luò)多層感知機和卷積神經(jīng)網(wǎng)絡(luò)等前饋網(wǎng)絡(luò)都不具備存儲或者記憶其他樣本或者樣本序列知識的能力。循環(huán)神經(jīng)網(wǎng)絡(luò)序列數(shù)據(jù),可以從先前輸入中獲取信息來影響當(dāng)前的輸入和輸出,因此其獨特之處在于擁有一定的“記憶”。7.1循環(huán)神經(jīng)網(wǎng)絡(luò)

7.1循環(huán)神經(jīng)網(wǎng)絡(luò)

7.1循環(huán)神經(jīng)網(wǎng)絡(luò)

7.1循環(huán)神經(jīng)網(wǎng)絡(luò)循環(huán)神經(jīng)網(wǎng)絡(luò)循環(huán)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)隱藏層經(jīng)常也被叫作循環(huán)單元。循環(huán)神經(jīng)網(wǎng)絡(luò)每個時間步的運算共享參數(shù)信息,每個時間步的運算是一致的,不同的僅僅是隱藏狀態(tài)和輸入。ot隱含層(A)

xt

o0A

x0

o1A

x1

o2A

x2

otA

xt

7.1循環(huán)神經(jīng)網(wǎng)絡(luò)循環(huán)神經(jīng)網(wǎng)絡(luò)的分類前饋網(wǎng)絡(luò)的輸入和輸出是單一的,而循環(huán)神經(jīng)網(wǎng)絡(luò)的輸入和輸出長度是可以改變的。根據(jù)輸入和輸出長度的不同,循環(huán)神經(jīng)網(wǎng)絡(luò)分為四種類型

一對一

一對多

多對一

多對多

7.1循環(huán)神經(jīng)網(wǎng)絡(luò)

7.1循環(huán)神經(jīng)網(wǎng)絡(luò)

7.2利用循環(huán)神經(jīng)網(wǎng)絡(luò)實現(xiàn)文本分類構(gòu)建一個循環(huán)神經(jīng)網(wǎng)絡(luò),將姓氏單詞作為輸入字符序列,每一步輸出一個預(yù)測,即姓氏屬于哪種語言;同時每次預(yù)測還輸出一個隱藏狀態(tài),該狀態(tài)被應(yīng)用于下一次預(yù)測。7.2利用循環(huán)神經(jīng)網(wǎng)絡(luò)實現(xiàn)文本分類數(shù)據(jù)18種語言的幾千個姓氏的數(shù)據(jù)集數(shù)據(jù)集由18個文件組成,每個文件以語言類別命名,文件內(nèi)容即為該語種的若干姓氏單詞。7.2利用循環(huán)神經(jīng)網(wǎng)絡(luò)實現(xiàn)文本分類數(shù)據(jù)導(dǎo)入字符處理相關(guān)的庫構(gòu)建字典,將語言映射到數(shù)字標(biāo)簽fromstringimportascii_lettersfromunidecodeimportunidecodedata_dir="./data/names/names"lang2label={file_name.split(".")[0]:torch.tensor([i],dtype=torch.long)fori,file_nameinenumerate(os.listdir(data_dir))}

#顯示所有標(biāo)簽print(lang2label)[輸出]{'Arabic':tensor([0]),'Chinese':tensor([1]),'Czech':tensor([2]),'Dutch':tensor([3]),'English':tensor([4]),'French':tensor([5]),'German':tensor([6]),'Greek':tensor([7]),'Irish':tensor([8]),'Italian':tensor([9]),'Japanese':tensor([10]),'Korean':tensor([11]),'Polish':tensor([12]),'Portuguese':tensor([13]),'Russian':tensor([14]),'Scottish':tensor([15]),'Spanish':tensor([16]),'Vietnamese':tensor([17])}7.2利用循環(huán)神經(jīng)網(wǎng)絡(luò)實現(xiàn)文本分類數(shù)據(jù)姓氏轉(zhuǎn)換為張量char2idx={letter:ifori,letterinenumerate(ascii_letters+"

.,:;-'")}

defname2tensor(name):tensor=torch.zeros(len(name),1,num_letters)

fori,charinenumerate(name):tensor[i][0][char2idx[char]]=1

returntensor7.2利用循環(huán)神經(jīng)網(wǎng)絡(luò)實現(xiàn)文本分類數(shù)據(jù)創(chuàng)建數(shù)據(jù)集tensor_names=[]target_langs=[]

forfileinos.listdir(data_dir):

withopen(os.path.join(data_dir,file))asf:lang=file.split(".")[0]names=[unidecode(line.rstrip())forlineinf]

fornameinnames:

try:tensor_names.append(name2tensor(name))target_langs.append(lang2label[lang])

exceptKeyError:

pass7.2利用循環(huán)神經(jīng)網(wǎng)絡(luò)實現(xiàn)文本分類數(shù)據(jù)數(shù)據(jù)集劃分fromsklearn.model_selectionimporttrain_test_split

train_idx,test_idx=train_test_split(range(len(target_langs)),test_size=0.1,

shuffle=True,stratify=target_langs)

train_dataset=[(tensor_names[i],target_langs[i])foriintrain_idx]

test_dataset=[(tensor_names[i],target_langs[i])foriintest_idx]#檢查數(shù)據(jù)集print(f"Train:{len(train_dataset)}")print(f"Test:{len(test_dataset)}")[輸出]Train:18063Test:20077.2利用循環(huán)神經(jīng)網(wǎng)絡(luò)實現(xiàn)文本分類模型模型定義classSimpleRNN(nn.Module):

def__init__(self,input_size,hidden_size,output_size):super(SimpleRNN,self).__init__()

self.hidden_size=hidden_size

self.in2hidden=nn.Linear(input_size+hidden_size,hidden_size)

self.in2output=nn.Linear(input_size+hidden_size,output_size)

defforward(self,x,hidden_state):#將輸入和隱藏狀態(tài)拼接,等價于式(7-1)combined=torch.cat((x,hidden_state),1)hidden=torch.sigmoid(self.in2hidden(combined))output=self.in2output(combined)

returnoutput,hidden

definit_hidden(self):

returnnn.init.kaiming_uniform_(torch.empty(1,self.hidden_size))7.2利用循環(huán)神經(jīng)網(wǎng)絡(luò)實現(xiàn)文本分類模型超參數(shù)hidden_size=256learning_rate=0.001#實例化模型

model=SimpleRNN(num_letters,hidden_size,num_langs)criterion=nn.CrossEntropyLoss()optimizer=torch.optim.Adam(model.parameters(),lr=learning_rate)num_epochs=5print_interval=30007.2利用循環(huán)神經(jīng)網(wǎng)絡(luò)實現(xiàn)文本分類模型訓(xùn)練forepochinrange(num_epochs):random.shuffle(train_dataset)

fori,(name,label)inenumerate(train_dataset):hidden_state=model.init_hidden()

forcharinname:output,hidden_state=model(char,hidden_state)loss=criterion(output,label)

optimizer.zero_grad()loss.backward()nn.utils.clip_grad_norm_(model.parameters(),1)optimizer.step()

if(i+1)%print_interval==0:print(f"Epoch[{epoch+1}/{num_epochs}],"f"Step[{i+1}/{len(train_dataset)}],"f"Loss:{loss.item():.4f}“

)[輸出]Epoch[1/5],Step[3000/18063],Loss:0.0057Epoch[1/5],Step[6000/18063],Loss:0.0002……Epoch[5/5],Step[15000/18063],Loss:0.0218Epoch[5/5],Step[18000/18063],Loss:5.44567.2利用循環(huán)神經(jīng)網(wǎng)絡(luò)實現(xiàn)文本分類模型測試num_correct=0num_samples=len(test_dataset)

model.eval()

withtorch.no_grad():forname,labelintest_dataset:hidden_state=model.init_hidden()forcharinname:output,hidden_state=model(char,hidden_state)_,pred=torch.max(output,dim=1)num_correct+=bool(pred==label)

print(f"Accuracy:{num_correct/num_samples*100:.4f}%")[輸出]Accuracy:78.8739%7.3長短期記憶網(wǎng)絡(luò)長程依賴序列數(shù)據(jù)中往往存在跨越很長時間步的數(shù)據(jù)之間的依賴關(guān)系,稱之為長程依賴(longtermdependence)。例子“鳥在嘰嘰喳喳地______?!?。“在過去的10年里,我一直在德國工作......我能說一口流利的______。”后者需要“德國”的上下文來預(yù)測文本中的最后一個單詞,而這句話最合適的答案是“德語”。相關(guān)信息與需要信息的點之間的距離可能變得非常大。7.3長短期記憶網(wǎng)絡(luò)長程依賴梯度問題導(dǎo)致很難對長程依賴進行建模;因為梯度問題容易導(dǎo)致訓(xùn)練時間長、性能差、精度低等現(xiàn)象。梯度問題當(dāng)梯度變得太?。?lt;<1)時,長程的狀態(tài)對參數(shù)更新影響微不足道,稱之為梯度消失。如果訓(xùn)練梯度傾向于指數(shù)增長而不是衰減,這稱為梯度爆炸;當(dāng)大的誤差梯度累積時,就會出現(xiàn)這個問題,導(dǎo)致在訓(xùn)練過程中對參數(shù)進行非常大的更新。7.3長短期記憶網(wǎng)絡(luò)

7.3長短期記憶網(wǎng)絡(luò)

7.3長短期記憶網(wǎng)絡(luò)

7.3長短期記憶網(wǎng)絡(luò)

7.3長短期記憶網(wǎng)絡(luò)

7.3長短期記憶網(wǎng)絡(luò)

7.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格Kaggle平臺上分享了美國股市數(shù)據(jù)集,該數(shù)據(jù)集包括紐約證交所、納斯達克和紐約證交所MKT交易的所有美國股票和ETF的完整歷史每日價格和交易量數(shù)據(jù)。import

pandas

aspd#定義讀取數(shù)據(jù)函數(shù)defstocks_data(symbols,dates):df=pd.DataFrame(index=dates)

forsymbolinsymbols:df_temp=pd.read_csv(".\\data\\Stock_Market_Dataset\\Data\\Stocks\\{}.us.txt".format(symbol),

index_col='Date',parse_dates=True,usecols=['Date','Close'],na_values=['nan'])df_temp=df_temp.rename(columns={'Close':symbol})df=df.join(df_temp)

returndf7.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格讀取并可視化Google、IBM和蘋果等三家公司的股票收盤價格#讀取3只股票某時間段數(shù)據(jù)并可視化展示dates=pd.date_range('2015-01-02','2016-12-31',freq='B')symbols=['goog','ibm','aapl']df=stocks_data(symbols,dates)df.fillna(method='pad')df.plot(figsize=(10,6),subplots=True);7.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格讀取并可視化Google、IBM和蘋果等三家公司的股票收盤價格7.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格加載數(shù)據(jù)#a.加載IBM公司股票收盤價數(shù)據(jù)dates=pd.date_range('2010-01-02','2017-10-11',freq='B')df1=pd.DataFrame(index=dates)df_ibm=pd.read_csv(".\\data\\Stock_Market_Dataset\\Data\\Stocks\\ibm.us.txt",parse_dates=True,index_col=0)df_ibm=df1.join(df_ibm)df_ibm[['Close']].plot(figsize=(15,6))plt.ylabel("股票價格")plt.title("IBM股票")plt.show()7.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格數(shù)據(jù)預(yù)處理fromsklearn.preprocessingimportMinMaxScaler#缺失值填充df_ibm=df_ibm.fillna(method='ffill')#歸一化scaler=MinMaxScaler(feature_range=(-1,1))df_ibm['Close']=scaler.fit_transform(df_ibm['Close'].values.reshape(-1,1))7.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格創(chuàng)建訓(xùn)練集和測試集#定義訓(xùn)練集、測試集數(shù)據(jù)創(chuàng)建函數(shù)defload_data(stock,look_back):data_raw=stock.valuesdata=[]

#創(chuàng)建一個長度為look_back的序列

forindexinrange(len(data_raw)-look_back):data.append(data_raw[index:index+look_back])

data=np.array(data);#取1/5為測試集test_set_size=int(np.round(0.2*data.shape[0]));train_set_size=data.shape[0]-(test_set_size);7.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格創(chuàng)建訓(xùn)練集和測試集x_train=data[:train_set_size,:-1,:]y_train=data[:train_set_size,-1,:]

x_test=data[train_set_size:,:-1]y_test=data[train_set_size:,-1,:]

return[x_train,y_train,x_test,y_test]

look_back=60#選擇序列長度x_train,y_train,x_test,y_test=load_data(df_ibm,look_back)print('x_train.shape=',x_train.shape)print('y_train.shape=',y_train.shape)print('x_test.shape=',x_test.shape)print('y_test.shape=',y_test.shape)7.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格創(chuàng)建訓(xùn)練集和測試集#將數(shù)據(jù)集轉(zhuǎn)換為張量類型x_train=torch.from_numpy(x_train).type(torch.Tensor)x_test=torch.from_numpy(x_test).type(torch.Tensor)y_train=torch.from_numpy(y_train).type(torch.Tensor)y_test=torch.from_numpy(y_test).type(torch.Tensor)[輸出]x_train.shape=(1574,59,1)y_train.shape=(1574,1)x_test.shape=(394,59,1)y_test.shape=(394,1)7.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格構(gòu)建模型#模型結(jié)構(gòu)參數(shù)input_dim=1#輸入特征維度,僅有一個價格,所以取1hidden_dim=32#隱藏層狀態(tài)維度num_layers=1#隱藏層層數(shù),可以堆疊多個隱藏層,≥1output_dim=1#輸出特征維度,僅有一個價格,所以取17.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格構(gòu)建模型#模型定義classLSTM(nn.Module):

def__init__(self,input_dim,hidden_dim,num_layers,output_dim):super(LSTM,self).__init__()

self.hidden_dim=hidden_dim

self.num_layers=num_layers#batch_first指定是否輸入輸出的第一維為batch_size,因為pytorch中batch_size#維度默認(rèn)是第二維度,故此選項可以將batch_siz放在第一維度。如input是(4,1,5),#中間的1是batch_size,指定batch_first=True后就是(1,4,5)

self.lstm=nn.LSTM(input_dim,hidden_dim,num_layers,batch_first=True)

#輸出層

self.fc=nn.Linear(hidden_dim,output_dim)7.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格構(gòu)建模型

defforward(self,x):#初始化隱藏層為0h0=torch.zeros(self.num_layers,x.size(0),self.hidden_dim).requires_grad_()#初始化單元狀態(tài)c0=torch.zeros(self.num_layers,x.size(0),self.hidden_dim).requires_grad_()#停止梯度回傳out,(hn,cn)=self.lstm(x,(h0.detach(),c0.detach()))#返回outout=self.fc(out[:,-1,:])

returnout7.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格構(gòu)建模型#創(chuàng)建模型實例

model=LSTM(input_dim=input_dim,hidden_dim=hidden_dim,output_dim=output_dim,num_layers=num_layers)

#設(shè)置損失函數(shù)loss_fn=torch.nn.MSELoss()#設(shè)置優(yōu)化器和學(xué)習(xí)率optimiser=torch.optim.Adam(model.parameters(),lr=0.01)7.4利用長短期記憶網(wǎng)絡(luò)預(yù)測股票價格訓(xùn)練模型num_epochs=100hist=np.zeros(num_epochs)

#序列維度seq_dim=look_back-1

fortinrange(num_epochs):y_train_pred=model(x_train)

loss=loss_fn(y_train_pred,y_train)

ift%10==0andt!=0:print("Epoch",t,"MSE:",loss.item())hist[t]=loss.item()#梯度歸零optimiser.zero_grad()#反向傳播loss.backward()#更新參數(shù)optimiser.step()[輸出]Epoch10MSE:0.0211124

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論