keras 简单 lstm实例(基于one-hot编码)


Posted in Python onJuly 02, 2020

简单的LSTM问题,能够预测一句话的下一个字词是什么

固定长度的句子,一个句子有3个词。

使用one-hot编码

各种引用

import keras
from keras.models import Sequential
from keras.layers import LSTM, Dense, Dropout
import numpy as np

数据预处理

data = 'abcdefghijklmnopqrstuvwxyz'
data_set = set(data)
 
word_2_int = {b:a for a,b in enumerate(data_set)}
int_2_word = {a:b for a,b in enumerate(data_set)}
 
word_len = len(data_set)
print(word_2_int)
print(int_2_word)

一些辅助函数

def words_2_ints(words):
 ints = []
 for itmp in words:
  ints.append(word_2_int[itmp])
 return ints
 
print(words_2_ints('ab'))
 
def words_2_one_hot(words, num_classes=word_len):
 return keras.utils.to_categorical(words_2_ints(words), num_classes=num_classes)
print(words_2_one_hot('a'))
def get_one_hot_max_idx(one_hot):
 idx_ = 0
 max_ = 0
 for i in range(len(one_hot)):
  if max_ < one_hot[i]:
   max_ = one_hot[i]
   idx_ = i
 return idx_
 
def one_hot_2_words(one_hot):
 tmp = []
 for itmp in one_hot:
  tmp.append(int_2_word[get_one_hot_max_idx(itmp)])
 return "".join(tmp)
 
print( one_hot_2_words(words_2_one_hot('adhjlkw')) )

构造样本

time_step = 3 #一个句子有3个词
 
def genarate_data(batch_size=5, genarate_num=100):
 #genarate_num = -1 表示一直循环下去,genarate_num=1表示生成一个batch的数据,以此类推
 #这里,我也不知道数据有多少,就这么循环的生成下去吧。
 #入参batch_size 控制一个batch 有多少数据,也就是一次要yield进多少个batch_size的数据
 '''
 例如,一个batch有batch_size=5个样本,那么对于这个例子,需要yield进的数据为:
 abc->d
 bcd->e
 cde->f
 def->g
 efg->h
 然后把这些数据都转换成one-hot形式,最终数据,输入x的形式为:
 
 [第1个batch]
 [第2个batch]
 ...
 [第genarate_num个batch]
 
 每个batch的形式为:
 
 [第1句话(如abc)]
 [第2句话(如bcd)]
 ...
 每一句话的形式为:
 
 [第1个词的one-hot表示]
 [第2个词的one-hot表示]
 ...
 '''
 cnt = 0
 batch_x = []
 batch_y = []
 sample_num = 0
 while(True):
  for i in range(len(data) - time_step):
   batch_x.append(words_2_one_hot(data[i : i+time_step]))
   batch_y.append(words_2_one_hot(data[i+time_step])[0]) #这里数据加[0],是为了符合keras的输出数据格式。 因为不加[0],表示是3维的数据。 你可以自己尝试不加0,看下面的test打印出来是什么
   sample_num += 1
   #print('sample num is :', sample_num)
   if len(batch_x) == batch_size:
    yield (np.array(batch_x), np.array(batch_y))
    batch_x = []
    batch_y = []
    if genarate_num != -1:
     cnt += 1
 
    if cnt == genarate_num:
     return
   
for test in genarate_data(batch_size=3, genarate_num=1):
 print('--------x:')
 print(test[0])
 print('--------y:')
 print(test[1])

搭建模型并训练

model = Sequential()
 
# LSTM输出维度为 128
# input_shape控制输入数据的形态
# time_stemp表示一句话有多少个单词
# word_len 表示一个单词用多少维度表示,这里是26维
 
model.add(LSTM(128, input_shape=(time_step, word_len)))
model.add(Dense(word_len, activation='softmax')) #输出用一个softmax,来分类,维度就是26,预测是哪一个字母
 
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
 
model.fit_generator(generator=genarate_data(batch_size=5, genarate_num=-1), epochs=50, steps_per_epoch=10)
#steps_per_epoch的意思是,一个epoch中,执行多少个batch
#batch_size是一个batch中,有多少个样本。
#所以,batch_size*steps_per_epoch就等于一个epoch中,训练的样本数量。(这个说法不对!再观察看看吧)
#可以将epochs设置成1,或者2,然后在genarate_data中打印样本序号,观察到样本总数。

使用训练后的模型进行预测:

result = model.predict(np.array([words_2_one_hot('bcd')]))

print(one_hot_2_words(result))

可以看到,预测结果为

e

补充知识:训练集产生的onehot编码特征如何在测试集、预测集复现

数据处理中有时要用到onehot编码,如果使用pandas自带的get_dummies方法,训练集产生的onehot编码特征会跟测试集、预测集不一样,正确的方式是使用sklearn自带的OneHotEncoder。

代码

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(handle_unknown='ignore')
data_train=pd.DataFrame({'职业':['数据挖掘工程师','数据库开发工程师','数据分析师','数据分析师'],
     '籍贯':['福州','厦门','泉州','龙岩']})
ohe.fit(data_train)#训练规则
feature_names=ohe.get_feature_names(data_train.columns)#获取编码后的特征名
data_train_onehot=pd.DataFrame(ohe.transform(data_train).toarray(),columns=feature_names)#应用规则在训练集上
 
data_new=pd.DataFrame({'职业':['数据挖掘工程师','jave工程师'],
     '籍贯':['福州','莆田']})
data_new_onehot=pd.DataFrame(ohe.transform(data_new).toarray(),columns=feature_names)#应用规则在预测集上

以上这篇keras 简单 lstm实例(基于one-hot编码)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python快速排序代码实例
Nov 21 Python
python模块restful使用方法实例
Dec 10 Python
python使用xauth方式登录饭否网然后发消息
Apr 11 Python
Python进阶-函数默认参数(详解)
May 18 Python
python自动化测试之如何解析excel文件
Jun 27 Python
python绘图模块matplotlib示例详解
Jul 26 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
Python实现自定义读写分离代码实例
Nov 16 Python
python 调整图片亮度的示例
Dec 03 Python
详解Python GUI编程之PyQt5入门到实战
Dec 10 Python
Python+Tkinter打造签名设计工具
Apr 01 Python
详解Golang如何实现支持随机删除元素的堆
Sep 23 Python
Python装饰器结合递归原理解析
Jul 02 #Python
Python OpenCV读取中文路径图像的方法
Jul 02 #Python
keras.utils.to_categorical和one hot格式解析
Jul 02 #Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 #Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 #Python
Python使用OpenPyXL处理Excel表格
Jul 02 #Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
Jul 02 #Python
You might like
分享一个超好用的php header下载函数
2014/01/31 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
2015/12/02 Javascript
js实现搜索框关键字智能匹配代码
2020/03/26 Javascript
深入理解JavaScript中的浮点数
2016/05/18 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
node.js入门学习之url模块
2017/02/25 Javascript
Angular2搜索和重置按钮过场动画
2017/05/24 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
AngularJS实现动态切换样式的方法分析
2018/06/26 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
vue 出现data-v-xxx的原因及解决
2020/08/04 Javascript
python 中split 和 strip的实例详解
2017/07/12 Python
基于python3 类的属性、方法、封装、继承实例讲解
2017/09/19 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
python环形单链表的约瑟夫问题详解
2018/09/27 Python
为什么你还不懂得怎么使用Python协程
2019/05/13 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
美国美食礼品篮网站:Gourmet Gift Baskets
2019/12/15 全球购物
夜大自我鉴定
2013/10/31 职场文书
往来会计岗位职责
2013/12/19 职场文书
追悼会上的答谢词
2014/01/10 职场文书
高中学生自我评价范文
2014/09/23 职场文书
铣工实训报告
2014/11/05 职场文书
2015小学五年级班主任工作总结
2015/05/21 职场文书
小型婚礼主持词
2015/06/30 职场文书
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS