資源簡介
基于Python的循環神經網絡(RNN)實現
代碼片段和文件信息
#?-*-?coding:?utf-8?-*-??
“““?
Created?on?Thu?t?08?17:36:23?2017
?
@author:?Administrator?
“““??
??
import?numpy?as?np??
#import?codecs??
??
dataSet?=?open(‘D:\\test.txt‘?‘r‘).read()?#讀取txt一整個文件的內容為字符串str類型??
charSet?=?list(set(dataSet))#去除重復的字符??
print?charSet??
#打印源文件中包含的字符個數、去重后字符個數??
dataSet_size?vocab_size?=?len(dataSet)?len(charSet)??
print?‘dataSet?has?%d?characters?%d?unique.‘?%?(dataSet_size?vocab_size)??
#創建字符的索引表??
char_to_ix?=?{?ch:i?for?ich?in?enumerate(charSet)?}??
ix_to_char?=?{?i:ch?for?ich?in?enumerate(charSet)?}??
print?char_to_ix??
hiddenSize?=?100?#?隱藏層神經元個數??
seq_length?=?20?#??
learning_rate?=?1e-1#學習率??
??
#網絡模型??
Input_Hidden?=?np.random.randn(hiddenSize?vocab_size)*0.01?#?輸入層到隱藏層??
Hidden_Hidden?=?np.random.randn(hiddenSize?hiddenSize)*0.01?#?隱藏層與隱藏層??
Hidden_Output?=?np.random.randn(vocab_size?hiddenSize)*0.01?#?隱藏層到輸出層,輸出層預測的是每個字符的概率??
Hidden_Bias?=?np.zeros((hiddenSize?1))?#隱藏層偏置項??
Output_Bias?=?np.zeros((vocab_size?1))?#輸出層偏置項??
#inputs??t時刻序列,也就是相當于輸入??
#targets?t+1時刻序列,也就是相當于輸出??
#hprev?t-1時刻的隱藏層神經元激活值??
def?lossFun(inputs?targets?hprev):??
????xs?hs?ys?ps?=?{}?{}?{}?{}??
????hs[-1]?=?np.copy(hprev)??
????loss?=?0??
????#前向傳導??
????for?t?in?xrange(len(inputs)):??
????????????xs[t]?=?np.zeros((vocab_size1))?#把輸入編碼成0、1格式,在input中,為0代表此字符未激活??
????????????xs[t][inputs[t]]?=?1??
????????????hs[t]?=?np.tanh(np.dot(Input_Hidden?xs[t])?+?np.dot(Hidden_Hidden?hs[t-1])?+?Hidden_Bias)?#?RNN的隱藏層神經元激活值計算??矩陣內積
????????????ys[t]?=?np.dot(Hidden_Output?hs[t])?+?Output_Bias?#?RNN的輸出??
????????????ps[t]?=?np.exp(ys[t])?/?np.sum(np.exp(ys[t]))?#?概率歸一化??
????????????loss?+=?-np.log(ps[t][targets[t]0])?#?softmax?損失函數??
????#反向傳播??
????dInput_Hidden?dHidden_Hidden?dHidden_Output?=?np.zeros_like(Input_Hidden)?np.zeros_like(Hidden_Hidden)?np.zeros_like(Hidden_Output)??
????dHidden_Bias?dOutput_Bias?=?np.zeros_like(Hidden_Bias)?np.zeros_like(Output_Bias)??
????dhnext?=?np.zeros_like(hs[0])??
????for?t?in?reversed(xrange(len(inputs))):??
????????dy?=?np.copy(ps[t])??
????????dy[targets[t]]?-=?1?#?backprop?into?y??
????????dHidden_Output?+=?np.dot(dy?hs[t].T)??
????????dOutput_Bias?+=?dy??
????????dh?=?np.dot(Hidden_Output.T?dy)?+?dhnext?#?backprop?into?h??
????????dhraw?=?(1?-?hs[t]?*?hs[t])?*?dh?#?backprop?through?tanh?nonlinearity??
????????dHidden_Bias?+=?dhraw??
????????dInput_Hidden?+=?np.dot(dhraw?xs[t].T)??
????????dHidden_Hidden?+=?np.dot(dhraw?hs[t-1].T)??
????????dhnext?=?np.dot(Hidden_Hidden.T?dhraw)??
????????for?dparam?in?[dInput_Hidden?dHidden_Hidden?dHidden_Output?dHidden_Bias?dOutput_Bias]:??
????????????np.clip(dparam?-5?5?out=dparam)?#?clip?to?mitigate?exploding?gradients??
????return?loss?dInput_Hidden?dHidden_Hidden?dHidden_
評論
共有 條評論