赞
踩
学习笔记。仅供参考!
基于keras框架的深度学习实战,利用三国演义文本集,LSTM神经网络模型,训练文本数据,预测文本,自动生成文本。
本文使用Sequential 顺序模型,它可以由多个网络层线性堆叠。也可以使用 Keras 函数式 API,可以构建任意的神经网络图。
Sequential 模型如下所示:
from keras.models import Sequential
model =Sequential()
使用 .add() 来堆叠模型:
from keras.layers import Dense
model.add(Dense(units=64, activation=‘relu’, input_dim=100))
model.add(Dense(units=10, activation=‘softmax’))
在完成了模型的构建后, 使用.compile() 来配置学习过程:
model.compile(loss=‘categorical_crossentropy’, optimizer=‘sgd’,metrics=[‘accuracy’])
如果需要,进一步地配置你的优化器。Keras 的核心原则是使事情变得相当简单,同时又允许用户在需要的时候能够进行完全的控制(终极的控制是源代码的易扩展性。
model.compile(loss=keras.losses.categorical_crossentropy,optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True))
现在,你可以批量地在训练数据上进行迭代了:
model.fit(x_train, y_train, epochs=5, batch_size=32)
或者,你可以手动地将批次的数据提供给模型
model.train_on_batch(x_batch, y_batch)
只需一行代码就能评估模型性能:
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)
对新的数据生成预测:
classes = model.predict(x_test, batch_size=128)
三国演义文本数据自取:
链接:https://pan.baidu.com/s/19-MktXVj2SaKGmAMIgVnFg
提取码:ri9w
数据处理,思路:60000多个字符集,按照步长为3做平移,得到20000多个长度为20的样本,作为输入X,每20个字符来预测第21个字符Y,sentences = [ ] 是X的集合,next_chars = [ ]是Y的集合
加载数据集 f = open('三国演义.txt', encoding='utf-8') text = f.read() print(text[:300]) f.close() print('语料总长度:', len(text)) sent_len = 20 # 样本长度,用前20个字来预测第21个字 step = 3 # 在总文本上面平移取样本,步长为3 sentences = [] # 样本集X,用来预测 next_chars = [] # 样本集Y,真实值 for i in range(0, len(text) - sent_len, step): # 获取样本,20个字符为一个样本,步长为3 sentences.append(text[i:i + sent_len]) # 预测文本的真实值 next_chars.append(text[i + sent_len]) print('训练样本数目:', len(sentences))
创建字典,根据索引对应相应的字符,N表示字典个数
char_set = sorted(list(set(text))) # 创建字典,文本的字符集,sorted()对文本进行排序
N = len(char_set) # 字典的长度,字的个数
print('字典中字的个数:', N)
# 根据值来获取索引,存入字典
char_indices = dict((char, index) for index, char in enumerate(char_set))
print(char_indices)
'''
语料总长度: 603705 >>>>文本总字符
训练样本数目: 201229 >>>>>取步长为3,得到训练样本2w
字典中字的个数: 3843 >>>>>根据N中字符的index来做one-hot编码,取index为1,其余取0
'''
对于输如样本X,是一个三维张量,(样本数量,样本长度,词向量N),利用N来表示词向量,将N中的值置为0,再根据char_indices ,将对应的字符找到相应的索引值,置为1,进而将词向量转成one-hot编码
print('Vectorization...')
print(len(sentences), sent_len, len(char_set))
# len(sentences), sent_len, len(char_set): 201229 20 3843
# 将样本数据np.zeros()张量数据置0,这里的N就是每一个字的词向量
x = np.zeros((len(sentences), sent_len, N), dtype=bool) # X用来做预测
y = np.zeros((len(sentences), len(char_set)), dtype=bool) # Y 真实集,sent_len=1
# 对每一个字做one-hot编码,构成词向量
for i, sentence in enumerate(sentences):
for t, char in enumerate(sentence):
x[i
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。