IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Keras快速入门 -> 正文阅读

[Python知识库]Keras快速入门

Keras顺势诞生

都知道有很多开源的深度学习工具包,比如:CNTK、TensorFlow、Theano、Caffe、mxNet和Torch。这些工具包都提供了非常灵活而强大的建模能力,极大地降低了使用深度学习技术的门槛。但是他们各有所长、接口不同,而且对于很多初学者,这些工具包过于灵活,难以掌握。Keras就此诞生,Keras可以认为是一个简单、在更高层上进行抽象,兼顾兼容性和灵活性的深度学习框架,也可以理解为一个以TensorFlow、CNTK为后台的深度学习建模环境。他底层可以在CNTK、TensorFlow之间自由切换。

Keras的优点

高度模块化,Keras中将任意网络模型描述成一个图模型或者序列模型,其中的部件被划分为以下模块:神经网络层、损失函数、激活函数、初始化方法、正则化方法、优化引擎。这些模块都可以以任意且合理的方式放入模型中。简单来说,Keras已经将基本的代码封装成了API,用户只需要根据自己的模型使用这些API进行建模就好了。这样大大的提高的编写效率。

基于Python的,用户可以使用Python自定义的自己的网络模型,可以在CPU和GPU之间无缝切换,适用于不同的应用环境。

Keras的数据处理

Keras在数据处理方面,提供了几个易于使用的工具,包括针对序列模型的数据预处理、针对文字输入的数据处理,以及针对图片输入的数据处理。所有的函数都在Keras.preprocessing这个库里面,分别有text、sequence和image三个子库。

1. 文字类型预处理

一般,文字在建模时,要把原始文字拆解成单字、单词或者词组,然后将这些拆分后的要素进行索引、标记化供机器学习算法使用。这种预处理叫作标注(Tokenize)。步骤大致为

  1. 文字拆分。
  2. 建立索引。
  3. 序列补齐(Padding)。
  4. 转换为矩阵。
  5. 使用标注类批量处理文本文件。

使用Keras的话,文字预处理函数都在Keras.preprocessing.text这个子库里。这里需Keras是为英文文字设计的,如果是处理中文,因为中英文的差异,建议使用结巴分词里提供的切分函数cut来进行文字拆分。

使用Keras预处理将变为:

第一步拆分需要用到text里的text_to_word_sequence函数,函数就是根据预定义的分隔符进行切割,将返回一个单词列表,过程中会先处理一下,比如将过滤表中的字符过滤掉,或者将字符都变为小写字母等。代码如下:

from  tensorflow import keras

if __name__ == '__main__':

    txt = "Those that come through the Ivory Gate cheat us with empty promises that never see fulfillment."
    out = keras.preprocessing.text.text_to_word_sequence(txt)
    print (out)

拆分结果:

当然你也可以加上限制条件,过滤词,大小写等等,但是对于中文来说就有问题了。代码如下:

import  tensorflow as tf
from  tensorflow import keras


if __name__ == '__main__':

    txt = "在文字的建模实践中,一般都需要把原始文字拆解成单字、单词或者词组,然后将这些拆分后的要素进行索引、标记化供机器学习算法使用。"
    out = keras.preprocessing.text.text_to_word_sequence(txt)
    print (out)

结果:

?中文中这个函数是以过滤符号为分隔符,而不是引号。对于处理中文,需要使用特定的工具,jieba是其中一种,需要自己安装(pip install jieba)。其使用了如下算法来进行中文分词。

  • 基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)。
  • 采用动态规划查找最大概率路径,找出基于词频的最大切分组合。
  • 对于未录入词,采用了基于汉字成词能力的HMM模型,使用Viterbi算法。

对于中文分词,结巴分词提供了jieba.cut和jieba.cut_for_search函数,其中cut是最常用的,cut_for_search是为搜索引擎构造索引所采用的比精确分词模式颗粒度略细的分词方法,返回一个可迭代的生成器(Generator)对象,可以使用for循环来获取分割后的单词。它们各自对应一个返回列表的函数,分别是lcut和lcut_for_search,其用法一样,只是返回数据类型不同。

cut/lcut接受三个参数,分别是需要分割的Unicode字符串、分词是否采用细颗粒度模式和是否使用HMM模型。代码演示如下:

import  tensorflow as tf
from  tensorflow import keras
import jieba

if __name__ == '__main__':

    txt = "在文字的建模实践中,一般都需要把原始文字拆解成单字、单词或者词组,然后将这些拆分后的要素进行索引、标记化供机器学习算法使用。"
    out1 = jieba.lcut(txt)
    print (out1)

结果:

['在', '文字', '的', '建模', '实践', '中', ',', '一般', '都', '需要', '把', '原始', '文字', '拆解', '成', '单字', '、', '单词', '或者', '词组', ',', '然后', '将', '这些', '拆分', '后', '的', '要素', '进行', '索引', '、', '标记', '化供', '机器', '学习', '算法', '使用', '。']

第二步建立索引:建立索引就是将拆分出来的每一个单字或者单词进行排序之后编号。可以使用如下代码进行建立索引。

  out1.sort(reverse=True)#反向排序
# 使用zip命令进行序号配对,使用list将配对完的数据转为列表,最后转为字典。
  dict(list(zip(out1,np.arange(len(out1)))))

当然也可以使用One Hot编码法,即对于K个不同的单字或者单词,依次设定一个1到K之间的数值来索引这K个单字或者单词构成的词汇表。可以直接使用one_hot函数。one_hot()函数,有俩参数,一个是需要加索引的字符串列表,一个是最大索引值。one_hot(str,n)

第三步序列补齐:因为需要放入多为矩阵中,需要进行补齐。因为将一段话拆分成单一的词以后,丢失了重要的上下文信息,因此将上下文的一组词放在一起建模能保持原来的上下文信息,从而提高建模的质量。大致分为两种情况。

第一种情况是自然的文本序列,比如微博上的一段话,都是一个自然的单字或者单词序列,而待建模的数据是由很多微博组成的,或者对一组文章进行建模,每篇文章中的每一句话构成一个文本序列。这个时候每句话的长度不一,需要进行补齐为统一长度。

第二种情况是将一个由K个(K较大)具备一定顺序的单词串拆分成小块的连续子串,每个子串只有M个(M<K)单词。这种情况一般是一大段文字按照固定长度移动一个窗口,将窗口内的单词索引载入多维矩阵的每一行,因此一句话可能会对应于矩阵的多行数据,形成时间步(timestep)。

当然对于补齐有pad_sequences函数,默认用0补齐,也可以用value选项修改。可以使用maxlen设定序列长度,不使用的就以最长的序列为标准。

第四步转为矩阵:因为所有的建模都只能使用多维矩阵,Keras提供了两种方法。

第一种方法是使用pad_sequences函数。这个函数可以生成一个宽度为指定句子长度、高度为句子个数的矩阵。假设text是一个包含每一句话的列表,而每一句话已经通过text_to_word_sequence或者jieba.cut函数拆分为单字或者单词的列表,使用这个函数就可以变为相应的矩阵。代码如下:

from keras.preprocessing.sequence import pad_sequences
import jieba
import numpy as np

if __name__ == '__main__':

    txt = "在文字的建模实践中,一般都需要把原始文字拆解成单字、单词或者词组,然后将这些拆分后的要素进行索引、标记化供机器学习算法使用。"
    out1 = jieba.lcut(txt)
    out1.sort(reverse=True)
    out=dict(list(zip(out1,np.arange(len(out1)))))
    X=[]
    x=[out[w] for w in out1]
    X.append(x)
    pad_sequences(X,10)

第二种方法是使用标注类进行。下一部分介绍.

第四步批量处理文本文件:批量处理文本时,Keras提供了一个标注类(Tokenizer class)来进行文本处理。当批量处理文本文件时,一般所有文本会被读入一个大的列表中,每一个元素是单个文件的文本或者一大段文本。上述方法都是针对单一字符串设计的,而标注类中的方法是针对一个文本列表设计的。这个类对应的操作数据有两种类型,分别是文本列表和单词串列表,对应的方法包含texts或者sequences字样,对应于文本列表的方法都是将文本拆分成单词串以后执行相应的操作。初始化标注对象。

  tokeizer=Tokenizer(nb_words=1000)

    # stext是已经从文本文件中读完后的列表变量,列表中的元素都是文件中的文本
# fit_on_text()函数的作用是对于输入的文本计算一些关键统计量,并对里面的元素进行索引。
  tokeizer.fit_on_texts(stext)

# 遍历stext列表变量,对于每一个字符串元素,使用上面提到的text_to_word_sequence函数进行拆分,并统一为小写字符。
  for s in stext:
      text_to_word_sequence(s,lower=True)
# 计算单词出现的总频率和在不同文件中分别出现的频率,并对单词表排序,然后计算单词总量,并按照上面的方法建立索引。

#完成上面操作,才可以进行列表拆分。
   word_sequence=tokeizer.texts_to_sequences(stext)

#拆分完补齐,与上面一致,使用pad_sequences函数
   pad_sequences(word_sequence,maxlen=MAX_sequence_length)

标注类中有两个方法是用来将文本序列列表转换为待建模矩阵的,text_to_matrixsequence_to_matrix。其中text_to_matrix是对从文本序列列表中抽取的每一个序列元素应用sequence_to_matrix转换为矩阵。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-09-21 00:24:34  更:2022-09-21 00:27:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 10:12:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码