溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python如何構(gòu)建單層LSTM模型

發(fā)布時(shí)間:2022-01-25 09:14:41 來源:億速云 閱讀:223 作者:iii 欄目:開發(fā)技術(shù)

這篇“Python如何構(gòu)建單層LSTM模型”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python如何構(gòu)建單層LSTM模型”文章吧。

1. 獲取訓(xùn)練原始數(shù)據(jù)

以下代碼從 jdk-tokens.txt 文件中讀取令牌并將其切片以適合我的桌面的硬件功能。就我而言,我只使用了代碼中顯示的代碼的 20%。

path = "./jdk-tokens.txt"
filetext = open(path).read().lower()
 
# slice the whole string to overcome memory limitation
slice = len(filetext)/5  
slice = int (slice)
filetext = filetext[:slice]
 
tokenized = filetext.split()
 
print('# of tokens:', len(tokenized))

2. 建立索引來定位令牌

LSTM 輸入只理解數(shù)字。將標(biāo)記轉(zhuǎn)換為數(shù)字的一種方法是為每個(gè)標(biāo)記分配一個(gè)唯一的整數(shù)。例如,如果代碼中有 1000 個(gè)唯一令牌,我們可以為 1000 個(gè)令牌中的每一個(gè)分配一個(gè)唯一編號(hào)。下面的代碼構(gòu)建了一個(gè)包含 [“public” : 0 ] [ “static” : 1 ], ... ] 等條目的字典。還生成反向字典用于解碼 LSTM 的輸出。

uniqueTokens = sorted(list(set(tokenized)))
print('total # of unique tokens:', len(uniqueTokens))
token_indices = dict((c, i) for i, c in enumerate(uniqueTokens))
indices_token = dict((i, c) for i, c in enumerate(uniqueTokens))

3. 準(zhǔn)備帶標(biāo)簽的訓(xùn)練序列

在這里,我們以 10 個(gè)標(biāo)記的半冗余序列剪切文本。每個(gè)序列是一個(gè)訓(xùn)練樣本,每個(gè)令牌序列的標(biāo)簽是下一個(gè)令牌。

NUM_INPUT_TOKENS = 10
step = 3
sequences = []
next_token = []
 
for i in range(0, len(tokenized) - NUM_INPUT_TOKENS, step):
    sequences.append(tokenized[i: i + NUM_INPUT_TOKENS])
    next_token.append(tokenized[i + NUM_INPUT_TOKENS])
 
print('nb sequences:', len(sequences))

4. 向量化訓(xùn)練數(shù)據(jù)

我們首先創(chuàng)建兩個(gè)矩陣,然后為每個(gè)矩陣賦值。一種用于特征,一種用于標(biāo)簽。len(sequences) 是訓(xùn)練樣本的總數(shù)。

X = np.zeros((len(sequences), NUM_INPUT_TOKENS, len(uniqueTokens)), \
             dtype=np.bool)
y = np.zeros((len(sequences), len(uniqueTokens)), dtype=np.bool)
for i, sentence in enumerate(sequences):
    for t, char in enumerate(sentence):
        X[i, t, token_indices[char]] = 1
    y[i, token_indices[next_token[i]]] = 1

5. 構(gòu)建單層 LSTM 模型

我們正在構(gòu)建一個(gè)如下所示的網(wǎng)絡(luò):

Python如何構(gòu)建單層LSTM模型

此外,堆疊兩個(gè) LSTM 層非常簡單,如下面的注釋代碼所示。

下面的代碼定義了神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)。該網(wǎng)絡(luò)包含一層具有 128 個(gè)隱藏單元的 LSTM。input_shape 參數(shù)指定輸入序列的長度和每次輸入的維度。Dense() 實(shí)現(xiàn)output = activation(dot(input, kernel) + bias)。這里的輸入是 LSTM 層的輸出。激活函數(shù)由行 Activation('softmax') 指定。Optimizer 是優(yōu)化函數(shù)。您可能熟悉邏輯回歸中常用的一種,即隨機(jī)梯度下降。最后一行指定了成本函數(shù)。在這種情況下,我們使用“categorical_crossentropy”。

model = Sequential()
 
# 1-layer LSTM
#model.add(LSTM(128, input_shape=(NUM_INPUT_TOKENS, len(uniqueTokens))))
 
# 2-layer LSTM
model.add(LSTM(128,return_sequences=True, \
               input_shape=(NUM_INPUT_TOKENS, len(uniqueTokens))))
model.add(LSTM(128))
 
model.add(Dense(len(uniqueTokens)))
model.add(Activation('softmax'))
 
optimizer = RMSprop(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=optimizer)
print(model.summary())

6.訓(xùn)練模型和生成Java代碼

上面,我還包含了堆疊另一層 LSTM 并使其成為 2 層 LSTM RNN 的代碼。

sample 函數(shù)用于從概率數(shù)組中采樣一個(gè)索引。例如,給定 preds=[0.5,0.2,0.3] 和默認(rèn)溫度,函數(shù)返回索引 0 的概率為 0.5、1 的概率為 0.2 2 的概率為 0.3。它用于避免一遍又一遍地生成相同的句子。我們希望看到 AI 程序員可以編寫的一些不同的代碼序列。

def sample(preds, temperature=1.0):
    # helper function to sample an index from a probability array
    preds = np.asarray(preds).astype('float64')
    preds = np.log(preds) / temperature
    exp_preds = np.exp(preds)
    preds = exp_preds / np.sum(exp_preds)
    probas = np.random.multinomial(1, preds, 1)
    return np.argmax(probas)
 
# train the model, output generated code after each iteration
for iteration in range(1, 60):
    print()
    print('-' * 50)
    print('Iteration', iteration)
    model.fit(X, y, batch_size=128, epochs=1)
 
    start_index = random.randint(0, len(tokenized) - NUM_INPUT_TOKENS - 1)
 
    for diversity in [0.2, 0.5, 1.0, 1.2]:
        print()
        print('----- diversity:', diversity)
 
        generated = [] #''
        sequence = tokenized[start_index: start_index + NUM_INPUT_TOKENS]
 
        generated=list(sequence)
 
        print('----- Generating with seed: "' + ' '.join(sequence) + '"-------')
        sys.stdout.write(' '.join(generated))
 
        for i in range(100):
            x = np.zeros((1, NUM_INPUT_TOKENS, len(uniqueTokens)))
            for t, char in enumerate(sequence):
                x[0, t, token_indices[char]] = 1.
 
            preds = model.predict(x, verbose=0)[0]
            next_index = sample(preds, diversity)
            next_pred_token = indices_token[next_index]
 
            generated.append(next_pred_token)
            sequence = sequence[1:]
            sequence.append(next_pred_token)
 
            sys.stdout.write(next_pred_token+" ")
            sys.stdout.flush()
        print()

7. 結(jié)果

訓(xùn)練模型需要幾個(gè)小時(shí)。我在第 40 次迭代時(shí)停止,生成的代碼如下所示:

----- Generating with seed: "true ) ; } else { boolean result = definesequals"-------
true ) ; } else { boolean result = definesequals
( ) . substring ( 1 , gradients . get ( p ) ; } 
if ( val . null || ( npoints == null ) ? new void . bitlength ( ) + prefixlength ) ; 
for ( int i = 0 ; i < num ; i ++ ) } break ; } 
if ( radix result = != other . off ) ; 
int endoff = b . append ( buf , 0 , len + 1 ) ; digits ++ ] ;

代碼生成看起來比以前基于字符的方法生成的代碼要好得多。請注意,為了便于閱讀,我添加了換行符。我們可以看到 LSTM 很好地捕獲了循環(huán)和條件,代碼開始變得更有意義。例如,“for ( int i = 0 ; i < num ; i ++ )” 是一個(gè)完美的 Java for循環(huán)。如果調(diào)整參數(shù)(如 NUM_INPUT_CHARS STEP)并訓(xùn)練更長時(shí)間,可能會(huì)得到更好的結(jié)果。隨意嘗試。

以上就是關(guān)于“Python如何構(gòu)建單層LSTM模型”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI