利用LSTM來生成文本-代碼詳解(部分)

# -*-coding: UTF-8 -*-
# @Time:2019/9/119:44
# @author superxjz
# @func LSTM
#導入實驗所需要的各種工具包
import numpy
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import LSTM
from keras.callbacks import ModelCheckpoint
from keras.utils import np_utils



#文本讀入

raw_text = open('../input/Winston_Churchil.txt').read()
#是大小寫無區別
raw_text = raw_text.lower()

#我們是以每個字母爲層級,字母總共才26個,用One-Hot來編碼出所有的字母
chars = sorted(list(set(raw_text)))
#enumerate在字典上是枚舉、列舉的意思,這裏創建了一個字典,i代表的是前面的序號,c代表的是詞
char_to_int = dict((c, i) for i, c in enumerate(chars))
int_to_char = dict((i, c) for i, c in enumerate(chars))

#我們需要把我們的raw text變成可以用來訓練的x,y:
#設置前後語境有多長
seq_length = 100
x = []
y = []
for i in range(0, len(raw_text) - seq_length):
    given = raw_text[i:i + seq_length]
    predict = raw_text[i + seq_length]
    #數量化
    #這裏調用函數返回的是xy各自在詞典中的序號0-61
    x.append([char_to_int[char] for char in given])
    y.append(char_to_int[predict])

"""
接下來我們做兩件事:

    我們已經有了一個input的數字表達(index),我們要把它變成LSTM需要的數組格式: [樣本數,時間步伐,特徵]

    第二,對於output,我們在Word2Vec裏學過,用one-hot做output的預測可以給我們更好的效果,相對於直接預測一個準確的y數值的話。

"""
#x裏面數據的個數
n_patterns = len(x)
#n_vocab是60
n_vocab = len(chars)

# 把x變成LSTM需要的樣子,x --->變成len(x)(樣本數)個數據,時間步伐設置爲100,特徵是1維的
x = numpy.reshape(x, (n_patterns, seq_length, 1))
# 簡單normal到0-1之間
x = x / float(n_vocab)
# output變成one-hot
y = np_utils.to_categorical(y)

print(x[11])
print(y[11])

# LSTM模型構建
#模型是前後關係的
model = Sequential()
#Lstm層100,1
model.add(LSTM(128, input_shape=(x.shape[1], x.shape[2])))
model.add(Dropout(0.2))
#輸出結果的計算,y.shape[1]=61
model.add(Dense(y.shape[1], activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')

#模型的訓練
model.fit(x, y, nb_epoch=10, batch_size=32)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章