keras实例学习-双向LSTM进行imdb情感分类
源码:https://github.com/keras-team/keras/blob/master/examples/imdb_bidirectional_lstm.py
1.imdb数据集
数据集来自 IMDB 的 25,000 条电影评论,以情绪(正面/负面)标记。评论已经过预处理,并编码为词索引(整数)的序列表示。为了方便起见,将词按数据集中出现的频率进行索引,例如整数 3 编码数据中第三个最频繁的词。
这允许快速筛选操作,例如:「只考虑前 10,000 个最常用的词,但排除前 20 个最常见的词」。
作为惯例,0 不代表特定的单词,而是被用于编码任何未知单词。
from keras.datasets import imdb (x_train, y_train), (x_test, y_test) = imdb.load_data(path="imdb.npz",
num_words=None,
skip_top=0,
maxlen=None,
seed=113,
start_char=1,
oov_char=2,
index_from=3)
返回:
- 2 个元组:
- x_train, x_test: 序列的列表,即词索引的列表。如果指定了
num_words
参数,则可能的最大索引值是num_words-1
。如果指定了maxlen
参数,则可能的最大序列长度为maxlen
。 - y_train, y_test: 整数标签列表 (1 或 0)。
参数:
- path: 如果你本地没有该数据集 (在
'~/.keras/datasets/' + path
),它将被下载到此目录。 - num_words: 整数或 None。要考虑的最常用的词语。任何不太频繁的词将在序列数据中显示为
oov_char
值。 - skip_top: 整数。要忽略的最常见的单词(它们将在序列数据中显示为
oov_char
值)。 - maxlen: 整数。最大序列长度。 任何更长的序列都将被截断。
- seed: 整数。用于可重现数据混洗的种子。
- start_char: 整数。序列的开始将用这个字符标记。设置为 1,因为 0 通常作为填充字符。
- oov_char: 整数。由于
num_words
或skip_top
限制而被删除的单词将被替换为此字符。 - index_from: 整数。使用此数以上更高的索引值实际词汇索引的开始。
- path: 如果你本地没有该数据集 (在
//主要还是关注num_words和maxlen两个参数吧,这两个都在我的ibdm_Bilstm.ipynb里试了。
num_words=2000,意思是只取下标为前2000的,出现次数最频繁的前2000个单词;maxlen=500是针对评论来说的,只取长度≤500的。
2.数据预处理
x_train=sequence.pad_sequences(x_train,maxlen=maxlen)
keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype='int32', padding='pre', truncating='pre', value=0.0)
将多个序列截断或补齐为相同长度。
该函数将一个 num_samples
的序列(整数列表)转化为一个 2D Numpy 矩阵,其尺寸为 (num_samples, num_timesteps)
。 num_timesteps
要么是给定的 maxlen
参数,要么是最长序列的长度。
比 num_timesteps
短的序列将在末端以 value
值补齐。
比 num_timesteps
长的序列将会被截断以满足所需要的长度。补齐或截断发生的位置分别由参数 pading
和 truncating
决定。
向前补齐为默认操作。
参数
- sequences: 列表的列表,每一个元素是一个序列。
- maxlen: 整数,所有序列的最大长度。
- dtype: 输出序列的类型。 要使用可变长度字符串填充序列,可以使用
object
。 - padding: 字符串,'pre' 或 'post' ,在序列的前端补齐还是在后端补齐。
- truncating: 字符串,'pre' 或 'post' ,移除长度大于
maxlen
的序列的值,要么在序列前端截断,要么在后端。 - value: 浮点数,表示用来补齐的值。
返回
- x: Numpy 矩阵,尺寸为
(len(sequences), maxlen)
。
异常
- ValueError: 如果截断或补齐的值无效,或者序列条目的形状无效。
//默认补齐和截断都是在序列前端pre的。
3. Sequential顺序模型
顺序模型是多个网络层的线性堆叠。
你可以通过将网络层实例的列表传递给 Sequential
的构造器,来创建一个 Sequential
模型。见
4. Embedding层
keras.layers.Embedding(input_dim, output_dim, embeddings_initializer='uniform', embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None)
将正整数(索引值)转换为固定尺寸的稠密向量。 例如: [[4], [20]] -> [[0.25, 0.1], [0.6, -0.2]]。
该层只能用作模型中的第一层。
参数
- input_dim: int > 0。词汇表大小, 即,最大整数 index + 1。
- output_dim: int >= 0。词向量的维度。
- embeddings_initializer:
embeddings
矩阵的初始化方法 (详见 initializers)。默认是均匀分布。 - embeddings_regularizer:
embeddings
matrix 的正则化方法 (详见 regularizer)。 - embeddings_constraint:
embeddings
matrix 的约束函数 (详见 constraints)。 - mask_zero: 是否把 0 看作为一个应该被遮蔽的特殊的 "padding" 值。 这对于可变长的 循环神经网络层 十分有用。 如果设定为
True
,那么接下来的所有层都必须支持 masking,否则就会抛出异常。 如果 mask_zero 为True
,作为结果,索引 0 就不能被用于词汇表中 (input_dim 应该与 vocabulary + 1 大小相同)。 - input_length: 输入序列的长度,当它是固定的时。 如果你需要连接
Flatten
和Dense
层,则这个参数是必须的 (没有它,dense 层的输出尺寸就无法计算)。
输入尺寸
尺寸为 (batch_size, sequence_length)
的 2D 张量。
输出尺寸
尺寸为 (batch_size, sequence_length, output_dim)
的 3D 张量。
5.Bidirectional
keras.layers.Bidirectional(layer, merge_mode='concat', weights=None)
RNN 的双向封装器,对序列进行前向和后向计算。
参数
- layer:
Recurrent
实例。 - merge_mode: 前向和后向 RNN 的输出的结合模式。 为 {'sum', 'mul', 'concat', 'ave', None} 其中之一。 如果是 None,输出不会被结合,而是作为一个列表被返回。
异常
- ValueError: 如果参数
merge_mode
非法。
6.LSTM
keras.layers.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal',
bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None,
recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False)
//这个参数也太多了吧。
参数
- units: 正整数,输出空间的维度。(也就是一个里面有多少个size吧)
- activation: 要使用的激活函数 (详见 activations)。 如果传入
None
,则不使用激活函数 (即 线性激活:a(x) = x
)。 - recurrent_activation: 用于循环时间步的激活函数 (详见 activations)。 默认:分段线性近似 sigmoid (
hard_sigmoid
)。 如果传入None
,则不使用激活函数 (即 线性激活:a(x) = x
)。 - use_bias: 布尔值,该层是否使用偏置向量。
- kernel_initializer:
kernel
权值矩阵的初始化器, 用于输入的线性转换 (详见 initializers)。
给出部分,其中units是必须的。
model.add(Bidirectional(LSTM(64)))
7.Dropout
keras.layers.Dropout(rate, noise_shape=None, seed=None)
将 Dropout 应用于输入。
Dropout 包括在训练中每次更新时, 将输入单元的按比率随机设置为 0, 这有助于防止过拟合。
参数
- rate: 在 0 和 1 之间浮动。需要丢弃的输入比例。
- noise_shape: 1D 整数张量, 表示将与输入相乘的二进制 dropout 掩层的形状。 例如,如果你的输入尺寸为
(batch_size, timesteps, features)
,然后 你希望 dropout 掩层在所有时间步都是一样的, 你可以使用noise_shape=(batch_size, 1, features)
。 - seed: 一个作为随机种子的 Python 整数。
//这里timesteps应该是可以说是上例中的句子长度10,共进行10个时间步能够将句子读完。
model.add(Dropout(0.5))
8.Dense
keras.layers.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None,
bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
常用的全连接层。
Dense
实现以下操作: output = activation(dot(input, kernel) + bias)
其中 activation
是按逐个元素计算的激活函数,kernel
是由网络层创建的权值矩阵,以及 bias
是其创建的偏置向量 (只在 use_bias
为 True
时才有用)。
- 注意: 如果该层的输入的秩大于2,那么它首先被展平然后 再计算与
kernel
的点乘。
参数
- units: 正整数,输出空间维度。
- activation: 激活函数 (详见 activations)。 若不指定,则不使用激活函数 (即,「线性」激活:
a(x) = x
)。 - use_bias: 布尔值,该层是否使用偏置向量。
- kernel_initializer:
kernel
权值矩阵的初始化器 (详见 initializers)。 - bias_initializer: 偏置向量的初始化器 (see initializers).
- kernel_regularizer: 运用到
kernel
权值矩阵的正则化函数 (详见 regularizer)。 - bias_regularizer: 运用到偏置向的的正则化函数 (详见 regularizer)。
- activity_regularizer: 运用到层的输出的正则化函数 (它的 "activation")。 (详见 regularizer)。
- kernel_constraint: 运用到
kernel
权值矩阵的约束函数 (详见 constraints)。 - bias_constraint: 运用到偏置向量的约束函数 (详见 constraints)。
输入尺寸
nD 张量,尺寸: (batch_size, ..., input_dim)
。 最常见的情况是一个尺寸为 (batch_size, input_dim)
的 2D 输入。
输出尺寸
nD 张量,尺寸: (batch_size, ..., units)
。 例如,对于尺寸为 (batch_size, input_dim)
的 2D 输入, 输出的尺寸为 (batch_size, units)
。
//但是实际上,参数里并没有input_dim这个参数,为什么在应用时会有呢?如下: //运行是没有问题的。
model = Sequential()
model.add(Dense(32, input_shape=(16,)))
# 现在模型就会以尺寸为 (*, 16) 的数组作为输入,
# 其输出数组的尺寸为 (*, 32) # 在第一层之后,你就不再需要指定输入的尺寸了:
model.add(Dense(32))
keras实例学习-双向LSTM进行imdb情感分类的更多相关文章
- keras—多层感知器MLP—IMDb情感分析
import urllib.request import os import tarfile from keras.datasets import imdb from keras.preprocess ...
- NLP(十九) 双向LSTM情感分类模型
使用IMDB情绪数据来比较CNN和RNN两种方法,预处理与上节相同 from __future__ import print_function import numpy as np import pa ...
- PaddlePaddle︱开发文档中学习情感分类(CNN、LSTM、双向LSTM)、语义角色标注
PaddlePaddle出教程啦,教程一部分写的很详细,值得学习. 一期涉及新手入门.识别数字.图像分类.词向量.情感分析.语义角色标注.机器翻译.个性化推荐. 二期会有更多的图像内容. 随便,帮国产 ...
- kaggle——Bag of Words Meets Bags of Popcorn(IMDB电影评论情感分类实践)
kaggle链接:https://www.kaggle.com/c/word2vec-nlp-tutorial/overview 简介:给出 50,000 IMDB movie reviews,进行0 ...
- 使用Keras进行深度学习:(六)LSTM和双向LSTM讲解及实践
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 介绍 长短期记忆(Long Short Term Memory, ...
- pytorch 文本情感分类和命名实体识别NER中LSTM输出的区别
文本情感分类: 文本情感分类采用LSTM的最后一层输出 比如双层的LSTM,使用正向的最后一层和反向的最后一层进行拼接 def forward(self,input): ''' :param inpu ...
- NLP文本情感分类传统模型+深度学习(demo)
文本情感分类: 文本情感分类(一):传统模型 摘自:http://spaces.ac.cn/index.php/archives/3360/ 测试句子:工信处女干事每月经过下属科室都要亲口交代24口交 ...
- TensorFlow之RNN:堆叠RNN、LSTM、GRU及双向LSTM
RNN(Recurrent Neural Networks,循环神经网络)是一种具有短期记忆能力的神经网络模型,可以处理任意长度的序列,在自然语言处理中的应用非常广泛,比如机器翻译.文本生成.问答系统 ...
- 文本情感分类:分词 OR 不分词(3)
为什么要用深度学习模型?除了它更高精度等原因之外,还有一个重要原因,那就是它是目前唯一的能够实现“端到端”的模型.所谓“端到端”,就是能够直接将原始数据和标签输入,然后让模型自己完成一切过程——包括特 ...
随机推荐
- apache 二级域名设置完整步骤
步骤如下: 1. 你要拥有一个有泛域名解析的顶级域名,例如:abc.com 在dns服务上设置,域名服务商都提供此服务 www.abc.com 指向服务器IPabc.com ...
- Spark RDD Transformation 简单用例(三)
cache和persist 将RDD数据进行存储,persist(newLevel: StorageLevel)设置了存储级别,cache()和persist()是相同的,存储级别为MEMORY_ON ...
- com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'id' at row 1
1.存储的值超过了字段长度.调整数据库中的字段长度 2,变更字段字符集编码为utf8
- TOP100summit:【分享实录】京东1小时送达的诞生之路
本篇文章内容来自2016年TOP100summit 京东WMS产品负责人李亚曼的案例分享. 编辑:Cynthia 李亚曼:京东 WMS产品负责人.从事电商物流行业近10年,有丰富的物流行业经验,独立打 ...
- ML.NET教程之情感分析(二元分类问题)
机器学习的工作流程分为以下几个步骤: 理解问题 准备数据 加载数据 提取特征 构建与训练 训练模型 评估模型 运行 使用模型 理解问题 本教程需要解决的问题是根据网站内评论的意见采取合适的行动. 可用 ...
- ESP8266 的几个代码 加深对LUA的理解
--some functions dofile("functions.lua") lighton1= lighton2= lighton3= lighton4= pin1 = pi ...
- win10 Java环境变量,hadoop 环境变量
妈呀,今天又重装了系统.需要装上java环境. 安装环境老百度,然后老掉坑.(path 路经) 1,新建环境变量 JAVA_HOME 2, 新建 CLASSPATH 环境变量 .;%JAVA_HOME ...
- 编译安装hadoop2.x
1.Requirements: * Unix System * JDK 1.7+ * Maven 3.0 or later * Findbugs 1.3.9 (if running findbugs) ...
- spark分组统计及二次排序案例一枚
组织数据形式: aa 11 bb 11 cc 34 aa 22 bb 67 cc 29 aa 36 bb 33 cc 30 aa 42 bb 44 cc 49 需求: 1.对上述数据按key值进行分组 ...
- OPTIMIZE TABLE linked list 表优化原理 链表数据结构 空间再利用
小结: 1.加快读写: 2.对于InnoDB表,在一定条件下,通过复制旧表重建: 3.实践中, 3.1.show processlist;查看线程,发现,认为堵塞读请求: 3.2.数据长度空间不变,索 ...