LSTM 对于循环网络的每一层都引入了状态(state)的概念,状态作为网络的记忆(memory)。但什么是记忆呢?记忆将由一个向量来表示,这个向量与元胞中神经元的元素数量相同。记忆单元将是一个由 n个元素长的浮点数(float)向量。

LSTM循环神经网络展开后的结构:

其中某个时刻LSTM单元的结构:
包含3 个门:遗忘门、输入/候选门和输出门
遗忘门(forget gate):它决定了上一时刻的单元状态c_t-1有多少保留到当前时刻c_t
输入门(input gate):它决定了当前时刻网络的输入x_t有多少保存到单元状态c_t
输出门(output gate):控制单元状态c_t有多少输出到 LSTM 的当前输出值h_t

有了 LSTM,模型可以开始学习人类习以为常和在潜意识层面上处理的语言模式。有了这些模式,我们不仅可以更精确地预测样本类别,还可以开始使用这些语言模式生成新的文本。

现使用包含lstm的循环神经网络分类 IMDB 电影评论数据集:
该算法的美妙之处在于,通过“记忆”它可以学习看到的词条之间的关系。网络现在能够对这些关系建模,尤其是在我们提供的代价函数的上下文中。

import numpy as np
import glob
import os
from random import shuffle
from nltk.tokenize import TreebankWordTokenizer
from gensim.models.keyedvectors import KeyedVectors
from nlpia.loaders import get_datafrom keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, LSTM
from keras.models import model_from_json
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()# 为NumPy和TensorFlow设置随机种子以确保可以得到一致的结果
np.random.seed(123)
tf.set_random_seed(123)# 向量化及分词器
word_vectors = KeyedVectors.load_word2vec_format('xxx\\googlenews-vectors-negative300.bin.gz',binary=True)# 加载数据
# 文档加载预处理
def pre_process_data(filepath):"""This is dependent on your training data source but we willtry to generalize it as best as possible."""positive_path = os.path.join(filepath, 'pos')negative_path = os.path.join(filepath, 'neg')pos_label = 1neg_label = 0dataset = []# glob是实用的文件名匹配库,glob.glob()函数将会匹配给定路径下的所有pattern,并以列表形式返回。# 用它可以查找符合特定规则的文件路径名for filename in glob.glob(os.path.join(positive_path, '*.txt')):with open(filename, 'r', encoding='UTF-8') as f:dataset.append((pos_label, f.read()))for filename in glob.glob(os.path.join(negative_path, '*.txt')):with open(filename, 'r', encoding='UTF-8') as f:dataset.append((neg_label, f.read()))shuffle(dataset)return dataset'''
这里有一些信息损失。谷歌新闻的 Word2vec 词汇表中只包含了一部分停用词,
使很多像“a”这样的常用词将在函数处理过程中被丢弃,这个处理不是特别理想,不过大家可
以通过这个方法得到一个信息有损失情况下的卷积神经网络的基线性能。如果想要避免信息损
失,大家可以单独训练 word2vec 模型,以确保有更好的向量覆盖率。另外,数据中还有很多类
似于<br\>的 HTML 标签,它们通常与文本的情感无关,必须从数据中去除。
'''
# 数据分词和向量化的方法
def tokenize_and_vectorize(dataset):tokenizer = TreebankWordTokenizer()vectorized_data = []for sample in dataset:tokens = tokenizer.tokenize(sample[1])sample_vecs = []for token in tokens:try:sample_vecs.append(word_vectors[token])except KeyError:pass # No matching token in the Google w2v vocabvectorized_data.append(sample_vecs)return vectorized_data# 目标标签
def collect_expected(dataset):""" Peel off the target values from the dataset """expected = []for sample in dataset:expected.append(sample[0])return expected# 分析填充或截断分别样本数
def test_len(data, maxlen):total_len = truncated = exact = padded = 0for sample in data:total_len += len(sample)if len(sample) > maxlen:truncated += 1elif len(sample) < maxlen:padded += 1else:exact +=1print('Padded: {}'.format(padded))print('Equal: {}'.format(exact))print('Truncated: {}'.format(truncated))print('Avg length: {}'.format(total_len/len(data)))dataset = pre_process_data('xxx\\aclImdb\\train')
# vectorized_data结构:[[[词向量], [], ...], [[], [], ...], ...]
vectorized_data = tokenize_and_vectorize(dataset)
# [...]
expected = collect_expected(dataset)
# 分析填充或截断分别样本数,以决定maxlen大小
print(test_len(vectorized_data, 400))# 划分训练集/测试集
split_point = int(len(vectorized_data)*.8)
x_train = vectorized_data[:split_point]
y_train = expected[:split_point]
x_test = vectorized_data[split_point:]
y_test = expected[split_point:]# RNN 参数
# maxlen 变量用于设置评论的最大长度,
# 需要展开RNN网络 400 次,可能发生梯度消失相关的问题,但是即使这样,这个网络也是非常有效的
maxlen = 205
# 在后向传播误差和更新权重前,向网络输入的样本数量
batch_size = 32
# 词向量的长度
embedding_dims = 300
# 整个训练数据集在网络中的传入次数
epochs = 2# 填充及截断词条序列,长度不够的填充元素为0的词向量,
# 通常我们不需要对循环神经网络使用填充或截断,
# 因为它们可以处理任意长度的输入序列
def pad_trunc(data, maxlen):"""For a given dataset pad with zero vectors or truncate to maxlen"""new_data = []# Create a vector of 0s the length of our word vectorszero_vector = []for _ in range(len(data[0][0])):zero_vector.append(0.0)for sample in data:if len(sample) > maxlen:temp = sample[:maxlen]elif len(sample) < maxlen:temp = sample# Append the appropriate number 0 vectors to the listadditional_elems = maxlen - len(sample)for _ in range(additional_elems):temp.append(zero_vector)else:temp = sample# 最后将扩展后的数据放在扩展数据列表的最后new_data.append(temp)return new_data# 收集经过扩展和截断的数据,并将其转换为 numpy 数组,以便在 Keras 中使用
x_train = pad_trunc(x_train, maxlen)
x_test = pad_trunc(x_test, maxlen)
# 大小为样本数量×序列长度×词向量长度
x_train = np.reshape(x_train, (len(x_train), maxlen, embedding_dims))
y_train = np.array(y_train)
x_test = np.reshape(x_test, (len(x_test), maxlen, embedding_dims))
y_test = np.array(y_test)# RNN
# 初始化一个空的 Keras 网络
num_neurons = 50
# 标准的分层模型-Sequential()(分层的)模型
model = Sequential()# 神奇的 Keras 处理了组装神经网络的各个复杂环节:我们只需要将想要
# 的循环层添加到我们的网络中
# 添加一个循环层
# 这一层的输出将是一个 400 个元素的向量,其中每个元素都是一个 50 个元素的向量
# return_sequences:True则每个时刻都要返回网络输出,输出为400 个向量,每个向量为 50 维
# return_sequences:False则只返回最后一个时刻的 50 维向量
model.add(LSTM( num_neurons, return_sequences=True,input_shape=(maxlen, embedding_dims)))
# 添加一个 dropout 层
model.add(Dropout(.2))
# 网络层 Flatten()将输入从 400 × 50 的张量扁平化为一个长度为 20 000 个元素的向量
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))# 编译循环神经网络
model.compile('rmsprop', 'binary_crossentropy', metrics=['accuracy'])
# model.summary():用于审察模型内部情况
print("模型摘要:\n", model.summary())# 训练并保存模型
model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_test, y_test))model_structure = model.to_json()
with open("lstm_model1.json", "w") as json_file:json_file.write(model_structure)
model.save_weights("lstm_weights1.h5")# 预测
# 加载模型
with open("lstm_model1.json", "r") as json_file:json_string = json_file.read()
model = model_from_json(json_string)
model.load_weights('lstm_weights1.h5')sample_1 = "I hate that the dismal weather had me down for so long, when will it break! Ugh, when does happiness return? " \"The sun is blinding and the puffy clouds are too thin. I can't wait for the weekend."
vec_list = tokenize_and_vectorize([(1, sample_1)])
test_vec_list = pad_trunc(vec_list, maxlen)
test_vec = np.reshape(test_vec_list, (len(test_vec_list), maxlen, embedding_dims))
print("Sample's sentiment, 1 - pos, 2 - neg : {}".format(model.predict_classes(test_vec)))
print("Raw output of sigmoid function: {}".format(model.predict(test_vec)))

自然语言处理--Keras 实现LSTM循环神经网络分类 IMDB 电影评论数据集相关推荐

  1. 自然语言处理--Keras 实现循环神经网络分类 IMDB 电影评论数据集

    那么为什么要使用 RNN 呢?不一定要选择循环神经网络,与前馈网络或卷积神经网络相比,它训练和传递新样本的成本相对较高(循环层计算成本较高). 但是循环网络在记忆能力方面的特殊优势即记住句子中出现过的 ...

  2. 自然语言处理--keras实现一维卷积网络对IMDB 电影评论数据集构建情感分类器

    为什么在 NLP 分类任务中选择 CNN 呢? 1.CNN神经网络可以像处理图像一样处理文本并"理解"它们 2.主要好处是高效率 3.在许多方面,由于池化层和卷积核大小所造成的限制 ...

  3. 自然语言处理-应用场景-文本分类:基于LSTM模型的情感分析【IMDB电影评论数据集】--(重点技术:自定义分词、文本序列化、输入数据批次化、词向量迁移使用)

    文本情感分类 1. 案例介绍 现在我们有一个经典的数据集IMDB数据集,地址:http://ai.stanford.edu/~amaas/data/sentiment/,这是一份包含了5万条流行电影的 ...

  4. Tensorflow2.*教程之使用Tensorflow Hub 对IMDB电影评论数据集进行文本分类(2)

    使用数据集: IMDB 数据集 库文件: tensorflow tensorflow_hub:用于迁移学习的库和平台 tensorflow_datasets:提供常用数据集 我们使用 Tensorfl ...

  5. RNN LSTM 循环神经网络 (分类例子)

    学习资料: 相关代码 为 TF 2017 打造的新版可视化教学代码 机器学习-简介系列 什么是RNN 机器学习-简介系列 什么是LSTM RNN 本代码基于网上这一份代码 code 设置 RNN 的参 ...

  6. 通过keras例子理解LSTM 循环神经网络(RNN)

    博文的翻译和实践: Understanding Stateful LSTM Recurrent Neural Networks in Python with Keras 正文 一个强大而流行的循环神经 ...

  7. 如何解决LSTM循环神经网络中的超长序列问题

    时间 2017-06-27 15:57:39  机器之心 原文  https://www.jiqizhixin.com/articles/e8d4e413-a718-49ac-ae79-c197ba8 ...

  8. 用c语言实现循环神经网络,浅谈LSTM循环神经网络

    姓名:程祖晗 学号:19021210938 [嵌牛导读]人工神经网络(ANN)由大量相互连接的神经元或称节点组成,这些节点经过网络中的大量加权连接,将数据进行相互通信,实现了神经网络的记忆特性.在常规 ...

  9. 第七章:Tensorflow2.0 RNN循环神经网络实现IMDB数据集训练(理论+实践)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/LQ_qing/article/deta ...

最新文章

  1. 直方图_20210420
  2. confluence统计用户文章_公众号流量主后台数据查看及统计分析
  3. LeetCode 217. Contains Duplicate
  4. 好嗨哟~谷歌量子神经网络新进展揭秘
  5. 基于单片机的贪吃蛇游戏设计_前端入门,基于html,css,javascript的贪吃蛇游戏
  6. ODBC / OLEDB___DAO / RDO / ADO
  7. innosetup 同名文件替换_运维工程师必备命令之文件管理
  8. 3-37Pytorch与torchvision
  9. WEB前端开发规范文档
  10. BooKu手机电子书阅读器,正式推出了
  11. 光伏并网逆变器意大利CEI 0-21标准
  12. http://www.cnblogs.com/qianmojing/p/6142178.html
  13. 计算机国际期刊等级,计算机期刊等级(全)
  14. 软件测试技术学习总结
  15. win10系统服务器怎样设置密码,win10系统的电脑如何给普通文件夹设置密码
  16. 那么多北漂程序员,到了35岁以后该怎么选择往后的路?
  17. 读入一句话(一行文本),统计26个大写字母各自出现的次数。(java)
  18. [笔记]攻防工具分享之 CobaltStrike框架 《二》生成后门
  19. 机器学习必看书籍和视频汇总
  20. YOLOX源码解读系列

热门文章

  1. 那些常被忽略的 html 标签
  2. java怎么设置表格分页显示_javaweb--layui表格分页
  3. Deep Graph Kernels
  4. geodatabase怎么连接MySQL_实用帖-手把手教你如何上传GEO数据库
  5. 「Adobe国际认证」关于 Adobe Photoshop启动“选择并遮住”工作区
  6. 【新手上路常见问答】关于物联网传输协议MQTT
  7. #概率论#n重伯努利实验
  8. 人脑VS机器?AI时代经济决策的机遇与挑战?| AI TIME 27
  9. 深扒人脸识别技术,原理、算法深度解析
  10. android 小米手机播放短小音频无声音问题