深度学习框架Keras介绍及实战

Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。

本文以Kaggle上的项目:IMDB影评情感分析为例,学习如何用Keras搭建一个神经网络,处理实际问题.阅读本文需要对神经网络有基础的了解.
文章分为两个部分:

  • Keras中的一些基本概念.Api用法.我会给出一些简单的使用样例,或是给出相关知识链接.
  • IMDB影评情感分析实战.用到的都是第一部分中讲到的知识点.

Model

Dense 全连接层

keras.layers.core.Dense(units, activation=None, use_bias=True, k
ernel_initializer='glorot_uniform', bias_initializer='zeros', ke
rnel_regularizer=None, bias_regularizer=None, activity_regulariz
er=None, kernel_constraint=None, bias_constraint=None)

# as first layer in a sequential model:
# as first layer in a sequential model:
model = Sequential()
model.add(Dense(32, input_shape=(16,)))
# now the model will take as input arrays of shape (*, 16)
# and output arrays of shape (*, 32)
# after the first layer, you don't need to specify
# the size of the input anymore:
model.add(Dense(32))

嵌入层 Embedding

keras.layers.embeddings.Embedding(input_dim, output_dim, embeddi
ngs_initializer='uniform', embeddings_regularizer=None, activity
_regularizer=None, embeddings_constraint=None, mask_zero=False,
input_length=None)

有兴趣的看这个链接https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/
其实就是word to vector。 这一层的作用就是得到用词向量表示的文本.

  • input_dim: 词表的大小.即不同的词的总个数.
  • output_dim:想要把词转换成多少维的向量.
  • input_length: 每一句的词的个数

比如如下代表:我们输入一个M*50的矩阵,这个矩阵中不同的词的个数为200,我们想把每个词转换为32维向量. 返回的是一个(M,50,32)的张量.
一个句子50个词,每个词是32维向量,共M个句子. 所以是e.shape=(M,50,32)

e = Embedding(200, 32, input_length=50)

LSTM层.

LSTM是循环神经网络的一种特殊情况.http://deeplearning.net/tutorial/lstm.html
简单来说,我们此前说过的神经网络,包括CNN,都是单向的,没有考虑序列关系,但是某个词的意义与其上下文是有关的,比如"我用着小米手机,吃着小米粥",两个小米肯定不是一个意思.在做语义分析的时候,需要考虑上下文. 循环神经网络RNN就是干这个事情的.或者说"这部电影质量很高,但是我不喜欢".这个句子里既有正面评价,又有负面评价,参考上下文的LSTM会识别出"但是"后面的才是我们想要重点表达的.

keras.layers.recurrent.LSTM(units, activation='tanh', recurrent_
activation='hard_sigmoid', use_bias=True, kernel_initializer='gl
orot_uniform', recurrent_initializer='orthogonal', bias_initiali
zer='zeros', unit_forget_bias=True, kernel_regularizer=None, rec
urrent_regularizer=None, bias_regularizer=None, activity_regular
izer=None, kernel_constraint=None, recurrent_constraint=None, bi
as_constraint=None, dropout=0.0, recurrent_dropout=0.0)

池化层

  • keras.layers.pooling.GlobalMaxPooling1D() #对时间信号的全局最大池化 https://stackoverflow.com/questions/43728235/what-is-the-difference-between-keras-maxpooling1d-and-globalmaxpooling1d-functi
    • input:形如( samples, steps, features) 的3D张量
    • output:形如(samples, features)的2D张量
  • keras.layers.pooling.MaxPooling1D(pool_size=2, strides=None, pad
    ding='valid')
  • keras.layers.pooling.MaxPooling2D(pool_size=(2, 2), strides=None
    , padding='valid', data_format=None)
  • keras.layers.pooling.MaxPooling3D(pool_size=(2, 2, 2), strides=N
    one, padding='valid', data_format=None)
  • ....

数据预处理

文本预处理

  • keras.preprocessing.text.text_to_word_sequence(text,
    filters=base_filter(), lower=True, split=" ")
  • keras.preprocessing.text.one_hot(text, n,
    filters=base_filter(), lower=True, split=" ")
  • keras.preprocessing.text.Tokenizer(num_words=None, filters=base_
    filter(),
    lower=True, split=" ")
    Tokenizer是一个用于向量化文本, 或将文本转换为序列( 即单词在字典中的下标构
    成的列表, 从1算起) 的类。
    • num_words: None或整数, 处理的最大单词数量。 若被设置为整数, 则分词器
      将被限制为处理数据集中最常见的 num_words 个单词
    • 不管num_words是几,fit_on_texts以后词典都是一样的,全部的词都有对应的index.只是在做texts_to_sequences时所得结果不同.
    • 会取最常出现的(num_words - 1)个词对应的index来代表句子.
    • 注意num_words不同时,准换后X_t的不同. 只取词典中出现最多的num_words - 1代表句子.如果一个句子中出现特别生僻的词,就会被过滤掉.比如一个句子="x y z".y,z不在词典中最常出现的top num_words-1的话,最后这个句子的向量形式则为[x_index_in_dic]
t1="i love that girl"
t2='i hate u'
texts=[t1,t2]
tokenizer = Tokenizer(num_words=None)
tokenizer.fit_on_texts(texts)  #得到词典 每个词对应一个index.
print( tokenizer.word_counts) #OrderedDict([('i', 2), ('love', 1), ('that', 1), ('girl', 1), ('hate', 1), ('u', 1)])
print( tokenizer.word_index) #{'i': 1, 'love': 2, 'that': 3, 'girl': 4, 'hate': 5, 'u': 6}
print( tokenizer.word_docs) #{'i': 2, 'love': 1, 'that': 1, 'girl': 1, 'u': 1, 'hate': 1})
print( tokenizer.index_docs) #{1: 2, 2: 1, 3: 1, 4: 1, 6: 1, 5: 1}
tokennized_texts = tokenizer.texts_to_sequences(texts) 
print(tokennized_texts) #[[1, 2, 3, 4], [1, 5, 6]] 每个词由其index表示X_t = pad_sequences(tokennized_texts, maxlen=None) #转换为2d array 即矩阵形式. 每个文本的词的个数均为maxlen. 不存在的词用0表示.
print(X_t)#[[1 2 3 4][0 1 5 6]]

序列预处理

  • keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None
    , dtype='int32',
    padding='pre', truncating='pre', value=0.)
    返回一个2阶张量
  • keras.preprocessing.sequence.skipgrams(sequence, vocabulary_size
    ,
    window_size=4, negative_samples=1., shuffle=True,
    categorical=False, sampling_table=None)
  • keras.preprocessing.sequence.make_sampling_table(size, sampling_
    factor=1e-5)

keras实战:IMDB影评情感分析

数据集介绍

  • labeledTrainData.tsv/imdb_master.csv 影评数据集 已经标注对电影是正面/负面评价
  • testData.tsv 测试集 需要预测评论是正面/负面

主要步骤

  • 数据读取
  • 数据清洗 主要包括去除停词,去除html tag,去除标点符号
  • 模型构建
    • 嵌入层:完成词到向量的转换
    • LSTM
    • 池化层:完成重要特征抽取
    • 全连接层:分类

数据加载

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df_train = pd.read_csv("./dataset/word2vec-nlp-tutorial/labeledTrainData.tsv", header=0, delimiter="\t", quoting=3)
df_train1=pd.read_csv("./dataset/imdb-review-dataset/imdb_master.csv",encoding="latin-1")
df_train1=df_train1.drop(["type",'file'],axis=1)
df_train1.rename(columns={'label':'sentiment','Unnamed: 0':'id','review':'review'}, inplace=True)
df_train1 = df_train1[df_train1.sentiment != 'unsup']
df_train1['sentiment'] = df_train1['sentiment'].map({'pos': 1, 'neg': 0})
new_train=pd.concat([df_train,df_train1])

数据清洗

用bs4处理html数据

  • 过滤出单词
  • 去除停用词
import re
from bs4 import BeautifulSoup
from nltk.corpus import stopwords
def review_to_words( raw_review ):review_text = BeautifulSoup(raw_review, 'lxml').get_text() letters_only = re.sub("[^a-zA-Z]", " ", review_text) words = letters_only.lower().split()                           stops = set(stopwords.words("english"))                  meaningful_words = [w for w in words if not w in stops]   return( " ".join( meaningful_words ))   new_train['review']=new_train['review'].apply(review_to_words)
df_test["review"]=df_test["review"].apply(review_to_words)

Keras搭建网络

文本转换为矩阵
- Tokenizer作用于list(sentence)得到词典.将词用词在词典中的Index做替换,得到数字矩阵
- pad_sequences做补0. 保证矩阵每一行数目相等. 即每个句子有相同数量的词.

list_classes = ["sentiment"]
y = new_train[list_classes].values
print(y.shape)
list_sentences_train = new_train["review"]
list_sentences_test = df_test["review"]max_features = 6000
tokenizer = Tokenizer(num_words=max_features)
tokenizer.fit_on_texts(list(list_sentences_train))
list_tokenized_train = tokenizer.texts_to_sequences(list_sentences_train)
list_tokenized_test = tokenizer.texts_to_sequences(list_sentences_test)print(len(tokenizer.word_index))totalNumWords = [len(one_comment) for one_comment in list_tokenized_train]
print(max(totalNumWords),sum(totalNumWords) / len(totalNumWords))maxlen = 400
X_t = pad_sequences(list_tokenized_train, maxlen=maxlen)
X_te = pad_sequences(list_tokenized_test, maxlen=maxlen)

模型构建

  • 词转向量
inp = Input(shape=(maxlen, ))
print(inp.shape) # (?, 400) #每个句子400个词
embed_size = 128 #每个词转换成128维的向量
x = Embedding(max_features, embed_size)(inp)
print(x.shape) #(?, 400, 128)
  • LSTM 60个神经元
  • GlobalMaxPool1D 相当于抽取出最重要的神经元输出
  • DropOut 丢弃部分输出 引入正则化,防止过拟合
  • Dense 全连接层
  • 模型编译时指定损失函数,优化器,模型效果评测标准
x = LSTM(60, return_sequences=True,name='lstm_layer')(x)
print(x.shape)
x = GlobalMaxPool1D()(x)
print(x.shape)
x = Dropout(0.1)(x)
print(x.shape)
x = Dense(50, activation="relu")(x)
print(x.shape)
x = Dropout(0.1)(x)
print(x.shape)
x = Dense(1, activation="sigmoid")(x)
print(x.shape)
model = Model(inputs=inp, outputs=x)
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
  • 模型训练
batch_size = 32
epochs = 2
print(X_t.shape,y.shape)
model.fit(X_t,y, batch_size=batch_size, epochs=epochs, validation_split=0.2)
  • 使用模型预测
prediction = model.predict(X_te)
y_pred = (prediction > 0.5)

转载于:https://www.cnblogs.com/sdu20112013/p/10428471.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统--处理机调度

4 处理机调度 4.1 调度类型 操作系统必须为多个进程的竞争请求分配计算机资源。处理机调度的任务就是选出待分派的作业或进程,为之分配处理机。 为了便于处理机调度管理,通常在处理机调度中采用分级调度方式,其中包括以下3级调度:…

permgen_什么是PermGen泄漏?

permgen接下来是对Java应用程序中特定类型的内存问题的实用介绍。 即–我们将分析导致java.lang.OutOfMemoryError:PermGen空间的错误 堆栈跟踪中的症状。 首先,我们将介绍理解该主题所需的核心概念,并解释什么是对象,类&#…

TP、PHP同域不同子级域名共享Session、单点登录

TP、PHP同域不同子级域名共享Session、单点登录 目的: 为了部署同个域名下不同子级域名共享会话,从而实现单点登录的问题,一处登录,同域处处子系统即可以实现自动登录。 PHP支持通过设置cookie使得同域不同子域共享SESSION 1. 通…

html语言书写注意事项,HTML注意事项(学习笔记)

1、在所有浏览器中都是有效的,但使用 其实是更长远的保障。类似的标签也一样2、标签最好用小写,未来的版本中可能强制用小写3、标签属性始终为属性值加引号属性值应该始终被包括在引号内。双引号是最常用的,不过使用单引号也没有问题。在某些…

UTF-8、GB2312、GB18030、GBK和BIG5等字符集编码范围的具体说明

一预备知识 1,字符:字符是抽象的最小文本单位。 它没有固定的形状(可能是一个字形),而且没有值。 “A”是一个字符,“”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字…

使用Forge,WildFly Swarm和Arquillian开发微服务

在本文中,我们将看到如何使用WildFly Swarm和Forge开发微服务,以及如何使用Arquillian和Rest Assured对其进行测试。 WildFly Swarm提供了一种创新的方法来打包和运行Java EE应用程序,方法是将它们与足够的服务器运行时一起打包以“ java -j…

html页面加载时触发的方法,在页面加载时触发onchange html事件

好的,我在select字段上有一个onchange事件。它现在很棒。当下拉“网络”更改时,它会刷新第二个下拉列表。我还希望顶部的ajax代码在页面加载和onchange上触发,以便填充第二个列表。这是因为它在编辑页面上。这是使用第一个的ajax调用function…

PYTHON-进阶-编码处理小结

开始 用python处理中文时,读取文件或消息,http参数等等 一运行,发现乱码(字符串处理,读写文件,print) 然后,大多数人的做法是,调用encode/decode进行调试,并没有明确思考为何出现乱码…

华为鸿蒙话题作文800字,关于鸿蒙OS 华为最高层发布最新通知:统一口径-华为,智能手机,鸿蒙...

6月2日晚,华为正式推出了HarmonyOS(鸿蒙操作系统),引发了国内外空前关注。OS操作系统是中国手机甚至整个科技行业的弱点,因此鸿蒙OS带来的震撼及争议都很多,甚至华为内部员工对它的认知也不相同。为此华为总裁办昨天发布了题为《关…

8-4 Fabled Rooks uva11134

题意:你的任务是在n*n的棋盘上放 n 小于5000 个车 使得任意两个车不互相攻击 且第i个车在一个给定的矩形ri之内 给出该矩形左上角坐标和右下角坐标四个点 必须满足放车的位置在矩形内 边上也行 如果无解输出IMPSSIBLE 行与列是独立的 所以可以分割成两个一模一…

谷歌guava_Google Guava MultiMaps

谷歌guava番石榴 这是我尝试解释和探索Google很棒的Guava java库的系列文章中的第一篇。 我在搜索Apache Commons Collections的通用版本时遇到了番石榴(Guava)–我需要一个Bimap并且厌倦了必须使用强制类型转换来填充我的代码–但是我发现要好得多。 …

python 获取系统相关编码的函数

怎么避免UnicodeEncodeError: ‘ascii’ codec can’t…类似的错误? 1、首先在py文件头部指定文件内容编码,例如:# coding: utf8 2、文件保存的时候要和py文件头部编码一致 3、在用decode和encode的时候,一定要确认要转换的字符原…

百度的html代码是什么,百度网页源代码是什么?

2017-07-28Java抓取网页的内容代码是什么public static String getHtmlReadLine(String httpurl){String CurrentLine”";String TotalString”";InputStream urlStream;String content”";try {URL url new URL(httpurl);// URL url new URL(“http://www。 …

html中高与行高的区别,深入了解css的行高Line Height属性

什么是行间距?古时候我们是用印刷机来处理文字,印出来的每个字都位于独立的一个块里。行间距,即传说中控制两行文字之间垂直距离的东东。在CSS,line-height被用来控制行与行之间的垂直距离。不过行间距与半行间距还是取决于CSS中的…

自动生成优化的Java类专业知识

如果您今年访问过JavaOne,您可能已经参加了我的演讲“如何从数据库生成定制的Java 8代码”。 在那次演讲中,我展示了如何使用Speedment Open Source工具包使用数据库作为域模型来生成各种Java代码。 我们没有时间要考虑的一件事是,Speedment不…

vue动态路由配置,vue路由传参

如果是不同的组件过来的,可以设置不同的id值,只要在目标组件获取属性id的值就可以了,参数就利用query.属性值来获取 转载于:https://www.cnblogs.com/xiaoqi2018/p/10434318.html

Linux Netcat 命令——网络工具中的瑞士军刀

netcat是网络工具中的瑞士军刀,它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。使用netcat命令所能完成的事情令人惊讶。 netcat所做的就是在两台电脑之间建立链接并返回两个数据流,在这之后…

win10怎么放计算机在桌面,win10我的电脑怎么放在桌面

win10我的电脑图标怎么放在桌面呢?一不小心将win10桌面上的此电脑图标删除了,找了半天都没找到它。win10系统怎么将我的电脑图标藏的隐蔽。今天,我就将找回win10我的电脑图标方法分享给你们刚重装完win10系统有些小伙伴就急急忙忙的来询问小编…

project 2013 显示标题

1、分析 右键只能插入任务,不能插入标题,而插入任务会被编号,目前只能在打印设置标题,不能在编辑界面显示标题的,或者使用最高级任务的方式 2、解决 文件,打印,页面设置,页眉&#x…

getopt在Python中的使用

在运行程序时,可能需要根据不同的条件,输入不同的命令行选项来实现不同的功能。目前有短选项和长选项两种格式。短选项格式为"-"加上单个字母选项;长选项为"--"加上一个单词。长格式是在Linux下引入的。许多Linux程序都支…