日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
十分鐘搞定Keras序列到序列學(xué)習(xí)(附代碼實(shí)現(xiàn))

如何在 Keras 中實(shí)現(xiàn) RNN 序列到序列學(xué)習(xí)?本文中,作者將嘗試對(duì)這一問(wèn)題做出簡(jiǎn)短解答;本文預(yù)設(shè)你已有一些循環(huán)網(wǎng)絡(luò)和 Keras 的使用經(jīng)驗(yàn)。

公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。成都創(chuàng)新互聯(lián)公司推出始興免費(fèi)做網(wǎng)站回饋大家。

GitHub:https://github.com/fchollet/keras/blob/master/examples/lstm_seq2seq.py

什么是序列到序列學(xué)習(xí)?

序列到序列學(xué)習(xí)(Seq2Seq)是指訓(xùn)練模型從而把一個(gè)域的序列(比如英語(yǔ)語(yǔ)句)轉(zhuǎn)化為另一個(gè)域的序列(比如法語(yǔ)中的對(duì)應(yīng)語(yǔ)句)。

 
 
 
 
  1. "the cat sat on the mat"->[Seq2Seqmodel]->"le chat etait assis sur le tapis" 

Seq2Seq 可用于機(jī)器翻譯或者省去問(wèn)題回答——通常來(lái)講,它可以隨時(shí)生成文本。完成這一任務(wù)有很多方式,比如 RNN 或一維卷積。本文只介紹 RNN。

次要案例:當(dāng)輸入序列和輸出序列長(zhǎng)度相同

當(dāng)輸入序列和輸出序列長(zhǎng)度相同時(shí),你可以通過(guò) Keras LSTM 或者 GRU 層(或者其中的堆棧)簡(jiǎn)單地實(shí)現(xiàn)模型。這一實(shí)例腳本中的案例展示了如何教會(huì) RNN 學(xué)習(xí)添加被編碼為字符串的數(shù)字:

一般案例:標(biāo)準(zhǔn)的 Seq2Seq

一般情況下,輸入序列和輸出序列有不同的長(zhǎng)度(比如機(jī)器翻譯)。這就需要一個(gè)更高級(jí)的設(shè)置,尤其在沒(méi)有進(jìn)一步語(yǔ)境的「序列到序列模型」時(shí)。下面是其工作原理:

  • 一個(gè) RNN 層(或其中的堆棧)作為「編碼器」:它處理輸入序列并反饋其內(nèi)部狀態(tài)。注意我們拋棄了編碼器 RNN 的輸出,只恢復(fù)其狀態(tài)。該狀態(tài)在下一步中充當(dāng)解碼器的「語(yǔ)境」。
  • 另一個(gè) RNN 層作為「解碼器」:在給定目標(biāo)序列先前字母的情況下,它被訓(xùn)練以預(yù)測(cè)目標(biāo)序列的下一個(gè)字符。具體講,它被訓(xùn)練把目標(biāo)序列轉(zhuǎn)化為相同序列,但接下來(lái)被一個(gè)時(shí)間步抵消,這一訓(xùn)練過(guò)程在語(yǔ)境中被稱(chēng)為「teacher forcing」。更重要的是,編碼器把其狀態(tài)向量用作初始狀態(tài),如此編碼器獲得了其將要生成的信息。實(shí)際上,在給定 targets[...t] 的情況下,解碼器學(xué)習(xí)生成 targets[t+1...],前提是在輸入序列上。

在推理模式中,即當(dāng)要解碼未知的輸入序列,我們完成了一個(gè)稍微不同的處理:

  1. 把輸入序列編碼進(jìn)狀態(tài)向量
  2. 從大小為 1 的目標(biāo)序列開(kāi)始
  3. 饋送狀態(tài)向量和 1 個(gè)字符的目標(biāo)序列到解碼器從而為下一字符生成預(yù)測(cè)
  4. 通過(guò)這些預(yù)測(cè)采樣下一個(gè)字符(我們使用 argmax)
  5. 把采樣的字符附加到目標(biāo)序列
  6. 不斷重復(fù)直至我們生成序列最后的字符或者達(dá)到字符的極限

相同的處理也可被用于訓(xùn)練沒(méi)有「teacher forcing」的 Seq2Seq 網(wǎng)絡(luò),即把解碼器的預(yù)測(cè)再注入到解碼器之中。

Keras 實(shí)例

讓我們用實(shí)際的代碼演示一下這些想法。

對(duì)于實(shí)例實(shí)現(xiàn),我們將使用一對(duì)英語(yǔ)語(yǔ)句及其法語(yǔ)翻譯的數(shù)據(jù)集,你可以從

http://www.manythings.org/anki/下載它,文件的名稱(chēng)是 fra-eng.zip。我們將會(huì)實(shí)現(xiàn)一個(gè)字符級(jí)別的序列到序列模型,逐個(gè)字符地處理這些輸入并生成輸出。另一個(gè)選擇是單詞級(jí)別的模型,它對(duì)機(jī)器學(xué)習(xí)更常用。在本文最后,你會(huì)發(fā)現(xiàn)通過(guò)嵌入層把我們的模型轉(zhuǎn)化為單詞級(jí)別模型的一些注釋。

這是實(shí)例的全部腳本:

https://github.com/fchollet/keras/blob/master/examples/lstm_seq2seq.py。

下面是這一過(guò)程的總結(jié):

1. 把語(yǔ)句轉(zhuǎn)化為 3 個(gè) Numpy 數(shù)組 encoder_input_data、decoder_input_data、decoder_target_data:

  • encoder_input_data 是一個(gè)形態(tài)的 3D 數(shù)組(num_pairs, max_english_sentence_length, num_english_characters),包含一個(gè)英語(yǔ)語(yǔ)句的獨(dú)熱向量化。
  • decoder_input_data 是一個(gè)形態(tài)的 3D 數(shù)組(num_pairs, max_french_sentence_length, num_french_characters),包含一個(gè)法語(yǔ)語(yǔ)句的獨(dú)熱向量化。
  • decoder_target_data 與 decoder_input_data 相同,但是被一個(gè)時(shí)間步抵消。decoder_target_data[:, t, :] 與 decoder_input_data[:, t + 1, :] 相同。

2. 在給定 encoder_input_data 和 decoder_input_data 的情況下,訓(xùn)練一個(gè)基本的基于 LSTM 的 Seq2Seq 模型以預(yù)測(cè) decoder_target_data。我們的模型使用 teacher forcing。

3. 解碼一些語(yǔ)句以檢查模型正在工作。

由于訓(xùn)練過(guò)程和推理過(guò)程(解碼語(yǔ)句)相當(dāng)不同,我們使用了不同的模型,雖然兩者具有相同的內(nèi)在層。這是我們的模型,它利用了 Keras RNN 的 3 個(gè)關(guān)鍵功能:

  • return_state 構(gòu)造函數(shù)參數(shù)配置一個(gè) RNN 層以反饋列表,其中第一個(gè)是其輸出,下一個(gè)是內(nèi)部的 RNN 狀態(tài)。這被用于恢復(fù)編碼器的狀態(tài)。
  • inital_state 調(diào)用參數(shù)指定一個(gè) RNN 的初始狀態(tài),這被用于把編碼器狀態(tài)作為初始狀態(tài)傳遞至解碼器。
  • return_sequences 構(gòu)造函數(shù)參數(shù)配置一個(gè) RNN 反饋輸出的全部序列。這被用在解碼器中。
 
 
 
 
  1. fromkeras.models importModel 
  2. fromkeras.layers importInput,LSTM,Dense 
  3. # Define an input sequence and process it. 
  4. encoder_inputs =Input(shape=(None,num_encoder_tokens)) 
  5. encoder =LSTM(latent_dim,return_state=True) 
  6. encoder_outputs,state_h,state_c =encoder(encoder_inputs) 
  7. # We discard `encoder_outputs` and only keep the states. 
  8. encoder_states =[state_h,state_c] 
  9. # Set up the decoder, using `encoder_states` as initial state. 
  10. decoder_inputs =Input(shape=(None,num_decoder_tokens)) 
  11. # We set up our decoder to return full output sequences, 
  12. # and to return internal states as well. We don't use the 
  13. # return states in the training model, but we will use them in inference. 
  14. decoder_lstm =LSTM(latent_dim,return_sequences=True,return_state=True) 
  15. decoder_outputs,_,_ =decoder_lstm(decoder_inputs, 
  16. initial_state=encoder_states) 
  17. decoder_dense =Dense(num_decoder_tokens,activation='softmax') 
  18. decoder_outputs =decoder_dense(decoder_outputs) 
  19. # Define the model that will turn 
  20. # `encoder_input_data` & `decoder_input_data` into `decoder_target_data` 
  21. model =Model([encoder_inputs,decoder_inputs],decoder_outputs) 

我們用這兩行代碼訓(xùn)練模型,同時(shí)在 20% 樣本的留存集中監(jiān)測(cè)損失。

 
 
 
 
  1. # Run training 
  2. model.compile(optimizer='rmsprop',loss='categorical_crossentropy') 
  3. model.fit([encoder_input_data,decoder_input_data],decoder_target_data, 
  4. batch_sizebatch_size=batch_size, 
  5. epochsepochs=epochs, 
  6. validation_split=0.2) 

大約 1 小時(shí)后在 MacBook CPU 上,我們已準(zhǔn)備好做推斷。為了解碼測(cè)試語(yǔ)句,我們將重復(fù):

編碼輸入語(yǔ)句,檢索初始解碼器狀態(tài)。

用初始狀態(tài)運(yùn)行一步解碼器,以「序列開(kāi)始」為目標(biāo)。輸出即是下一個(gè)目標(biāo)字符。

附加預(yù)測(cè)到的目標(biāo)字符并重復(fù)。

這是我們的推斷設(shè)置:

 
 
 
 
  1. encoder_model =Model(encoder_inputs,encoder_states) 
  2. decoder_state_input_h =Input(shape=(latent_dim,)) 
  3. decoder_state_input_c =Input(shape=(latent_dim,)) 
  4. decoder_states_inputs =[decoder_state_input_h,decoder_state_input_c] 
  5. decoder_outputs,state_h,state_c =decoder_lstm( 
  6. decoder_inputs,initial_state=decoder_states_inputs) 
  7. decoder_states =[state_h,state_c] 
  8. decoder_outputs =decoder_dense(decoder_outputs) 
  9. decoder_model =Model( 
  10. [decoder_inputs]+decoder_states_inputs, 
  11. [decoder_outputs]+decoder_states) 

我們使用它實(shí)現(xiàn)上述推斷循環(huán)(inference loop):

 
 
 
 
  1. defdecode_sequence(input_seq): 
  2. # Encode the input as state vectors. 
  3. states_value =encoder_model.predict(input_seq) 
  4. # Generate empty target sequence of length 1. 
  5. target_seq =np.zeros((1,1,num_decoder_tokens)) 
  6. # Populate the first character of target sequence with the start character. 
  7. target_seq[0,0,target_token_index['t']]=1. 
  8. # Sampling loop for a batch of sequences 
  9. # (to simplify, here we assume a batch of size 1). 
  10. stop_condition =False 
  11. decoded_sentence ='' 
  12. whilenotstop_condition: 
  13. output_tokens,h,c =decoder_model.predict( 
  14. [target_seq]+states_value) 
  15. # Sample a token 
  16. sampled_token_index =np.argmax(output_tokens[0,-1,:]) 
  17. sampled_char =reverse_target_char_index[sampled_token_index] 
  18. decoded_sentence +=sampled_char 
  19. # Exit condition: either hit max length 
  20. # or find stop character. 
  21. if(sampled_char =='n'or 
  22. len(decoded_sentence)>max_decoder_seq_length): 
  23. stop_condition =True 
  24. # Update the target sequence (of length 1). 
  25. target_seq =np.zeros((1,1,num_decoder_tokens)) 
  26. target_seq[0,0,sampled_token_index]=1. 
  27. # Update states 
  28. states_value =[h,c] 
  29. returndecoded_sentence 

我們得到了一些不錯(cuò)的結(jié)果——這在意料之中,因?yàn)槲覀兘獯a的樣本來(lái)自訓(xùn)練測(cè)試。

 
 
 
 
  1. Inputsentence:Benice. 
  2. Decodedsentence:Soyezgentil ! 
  3. Inputsentence:Dropit! 
  4. Decodedsentence:Laisseztomber ! 
  5. Inputsentence:Getout! 
  6. Decodedsentence:Sortez?! 

這就是我們的十分鐘入門(mén) Keras 序列到序列模型教程。完整代碼詳見(jiàn) GitHub:

https://github.com/fchollet/keras/blob/master/examples/lstm_seq2seq.py。

常見(jiàn)問(wèn)題

1. 我想使用 GRU 層代替 LSTM,應(yīng)該怎么做?

這實(shí)際上變簡(jiǎn)單了,因?yàn)?GRU 只有一個(gè)狀態(tài),而 LSTM 有兩個(gè)狀態(tài)。這是使用 GRU 層適應(yīng)訓(xùn)練模型的方法:

 
 
 
 
  1. encoder_inputs =Input(shape=(None,num_encoder_tokens)) 
  2. encoder =GRU(latent_dim,return_state=True) 
  3. encoder_outputs,state_h =encoder(encoder_inputs) 
  4. decoder_inputs =Input(shape=(None,num_decoder_tokens)) 
  5. decoder_gru =GRU(latent_dim,return_sequences=True) 
  6. decoder_outputs =decoder_gru(decoder_inputs,initial_state=state_h) 
  7. decoder_dense =Dense(num_decoder_tokens,activation='softmax') 
  8. decoder_outputs =decoder_dense(decoder_outputs) 
  9. model =Model([encoder_inputs,decoder_inputs],decoder_outputs) 

2. 我想使用整數(shù)序列的單詞級(jí)別模型,應(yīng)該怎么做?

如果你的輸入是整數(shù)序列(如按詞典索引編碼的單詞序列),你可以通過(guò) Embedding 層嵌入這些整數(shù)標(biāo)記。方法如下:

 
 
 
 
  1. # Define an input sequence and process it. 
  2. encoder_inputs =Input(shape=(None,)) 
  3. x =Embedding(num_encoder_tokens,latent_dim)(encoder_inputs) 
  4. x,state_h,state_c =LSTM(latent_dim, 
  5. return_state=True)(x) 
  6. encoder_states =[state_h,state_c] 
  7. # Set up the decoder, using `encoder_states` as initial state. 
  8. decoder_inputs =Input(shape=(None,)) 
  9. x =Embedding(num_decoder_tokens,latent_dim)(decoder_inputs) 
  10. x =LSTM(latent_dim,return_sequences=True)(x,initial_state=encoder_states) 
  11. decoder_outputs =Dense(num_decoder_tokens,activation='softmax')(x) 
  12. # Define the model that will turn 
  13. # `encoder_input_data` & `decoder_input_data` into `decoder_target_data` 
  14. model =Model([encoder_inputs,decoder_inputs],decoder_outputs) 
  15. # Compile & run training 
  16. model.compile(optimizer='rmsprop',loss='categorical_crossentropy') 
  17. # Note that `decoder_target_data` needs to be one-hot encoded, 
  18. # rather than sequences of integers like `decoder_input_data`! 
  19. model.fit([encoder_input_data,decoder_input_data],decoder_target_data, 
  20. batch_sizebatch_size=batch_size, 
  21. epochsepochs=epochs, 
  22. validation_split=0.2) 

3. 如果我不想使用「teacher forcing」,應(yīng)該怎么做?

一些案例中可能不能使用 teacher forcing,因?yàn)槟銦o(wú)法獲取完整的目標(biāo)序列,比如,在線(xiàn)訓(xùn)練非常長(zhǎng)的語(yǔ)句,則緩沖完成輸入-目標(biāo)語(yǔ)言對(duì)是不可能的。在這種情況下,你要通過(guò)將解碼器的預(yù)測(cè)重新注入解碼器輸入進(jìn)行訓(xùn)練,就像我們進(jìn)行推斷時(shí)所做的那樣。

你可以通過(guò)構(gòu)建硬編碼輸出再注入循環(huán)(output reinjection loop)的模型達(dá)到該目標(biāo):

 
 
 
 
  1. fromkeras.layers importLambda 
  2. fromkeras importbackend asK 
  3. # The first part is unchanged 
  4. encoder_inputs =Input(shape=(None,num_encoder_tokens)) 
  5. encoder =LSTM(latent_dim,return_state=True) 
  6. encoder_outputs,state_h,state_c =encoder(encoder_inputs) 
  7. states =[state_h,state_c] 
  8. # Set up the decoder, which will only process one timestep at a time. 
  9. decoder_inputs =Input(shape=(1,num_decoder_tokens)) 
  10. decoder_lstm =LSTM(latent_dim,return_sequences=True,return_state=True) 
  11. decoder_dense =Dense(num_decoder_tokens,activation='softmax') 
  12. all_outputs =[] 
  13. inputs =decoder_inputs 
  14. for_ inrange(max_decoder_seq_length): 
  15. # Run the decoder on one timestep 
  16. outputs,state_h,state_c =decoder_lstm(inputs, 
  17. initial_state=states) 
  18. outputs =decoder_dense(outputs) 
  19. # Store the current prediction (we will concatenate all predictions later) 
  20. all_outputs.append(outputs) 
  21. # Reinject the outputs as inputs for the next loop iteration 
  22. # as well as update the states 
  23. inputs =outputs 
  24. states =[state_h,state_c] 
  25. # Concatenate all predictions 
  26. decoder_outputs =Lambda(lambdax:K.concatenate(x,axis=1))(all_outputs) 
  27. # Define and compile model as previously 
  28. model =Model([encoder_inputs,decoder_inputs],decoder_outputs) 
  29. model.compile(optimizer='rmsprop',loss='categorical_crossentropy') 
  30. # Prepare decoder input data that just contains the start character 
  31. # Note that we could have made it a constant hard-coded in the model 
  32. decoder_input_data =np.zeros((num_samples,1,num_decoder_tokens)) 
  33. decoder_input_data[:,0,target_token_index['t']]=1. 
  34. # Train model as previously 
  35. model.fit([encoder_input_data,decoder_input_data],decoder_target_data, 
  36. batch_sizebatch_size=batch_size, 
  37. epochsepochs=epochs, 
  38. validation_split=0.2) 

原文:

https://blog.keras.io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras.html

【本文是專(zhuān)欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】

戳這里,看該作者更多好文


本文題目:十分鐘搞定Keras序列到序列學(xué)習(xí)(附代碼實(shí)現(xiàn))
文章地址:http://www.5511xx.com/article/dphiide.html