昨天配置了tensorflow的gpu版本,今天开始简单的使用一下

主要是看了一下tensorflow的tutorial 里面的 IMDB 电影评论二分类这个教程

教程里面主要包括了一下几个内容:下载IMDB数据集,显示数据(将数组转换回评论文本),准备数据,建立模型(隐层设置,优化器和损失函数的配置),建立一个验证集,训练模型,评估模型,显示训练精度和损失图。

代码我已经完全上传到我的github中去了  https://github.com/OnesAlone/deepLearning/blob/master/two_classification_with_movie_review.ipynb

大部分内容均有注释

下面我简单介绍一下:

首先导入需要的工具包,包括tensorflow,keras,numpy,再下载imdb数据集

import tensorflow as tf
from tensorflow import keras
import numpy as np imdb = keras.datasets.imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

  下载完成后可以用

len(train_data[0]), len(train_data[1])

  检查一下是否下载完成

接下来是将整形数组转换为原始的影评(对于训练模型来说没有影响)

# 字典:用于将数字转向单词
word_index = imdb.get_word_index() # key值不变,value值加3,并新增了4个键值对
word_index = {k:(v+3) for k,v in word_index.items()}
word_index["<PAD>"] = 0 # 用来将每一个sentence扩充到同等长度
word_index["<START>"] = 1
word_index["<UNK>"] = 2 # 未知,可能是生僻单词或是人名
word_index["UNUSED"] = 3 # 将键值对的键与值互换
reverse_word_index = dict([(value,key) for (key,value) in word_index.items()]) # 转译为原句
def decode_review(text):
return ' '.join([reverse_word_index.get(i,'?') for i in text])

  输入

decode_review(train_data[0])

  确认一下是否可以转化,转化结果如下所示

接下来对数据进性预处理

因为每一个sequence的长度不一致,为了将其输入到神经网络中,需要将他们的维度做一下预处理,有两种方式

第一种:one-hot编码 将每一个sequence转译成num_words(10000)个 0s和 1s,代表每一个单词是否出现过,这种方式仅统计是否出现和不统计词频,且是内存密集型的编码,总计会有num_words * num_reviews 大小的matrix

第二种:扩展整数数组让他们拥有相同的长度,这样每一个sequence会有共同的max_length(256),总计会占用 max_length*num_reviews大小

教程内采用第二种,在sequence后面扩充0

train_data = keras.preprocessing.sequence.pad_sequences(train_data,value=word_index["<PAD>"],padding='post',maxlen=256)

test_data = keras.preprocessing.sequence.pad_sequences(test_data,value=word_index["<PAD>"],padding='post',maxlen=256)

 接下来构建模型

输入数据是单词组合,标签是0或者1

先进行数据稀疏稠密化,因为sequence里面的word_index值是[0~10000]内稀疏的,所以将每一个单词用一个16维的向量代替;input(1024,256)output(1024,256,16)

再通过均值的池化层,将每一个sequence做均值,类似于将单词合并 ;input(1024,256,16),output(1024,16)

全连接层采用relu激活函数;input(1024,16),output(1024,16)

全连接层采用sigmoid激活函数;input(1024,16),output(1024,1)

vocab_size = 10000

model = keras.Sequential()
model.add(keras.layers.Embedding(vocab_size,16))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16,activation=tf.nn.relu))
model.add(keras.layers.Dense(1,activation=tf.nn.sigmoid)) model.summary()

  因为采用了sigmoid激活函数,所以损失函数不能用mse均方误差,因为在sigmoid函数的两端梯度很小,会使w和b更新很慢 ,所以采用交叉熵代价函数(cross-entropy cost function)

  

model.compile(optimizer=tf.train.AdamOptimizer(),loss='binary_crossentropy',metrics=['accuracy'])

  构建训练集

x_val =train_data[:10000]
partial_x_train = train_data[10000:] y_val = train_labels[:10000]
partial_y_train = train_labels[10000:]

  开始训练模型,并将训练模型过程中的一些参数如训练精度和交叉验证精度等保存在history中

history = model.fit(partial_x_train,partial_y_train,epochs=40,batch_size=1024,validation_data=(x_val,y_val),verbose=1)

  评估模型

results = model.evaluate(test_data, test_labels)
results

  

可以看到精度大概在87%

最后通过matplot显示训练过程中的一些参数

import matplotlib.pyplot as plt

acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss'] epochs = range(1, len(acc) + 1) plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend() plt.show()

plt.clf()   # 清除图表
acc_values = history_dict['acc']
val_acc_values = history_dict['val_acc'] plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend() plt.show()

  

交叉熵代价函数具有非负性和当真实输出与期望输出相近的时候,代价函数接近于零

tensorflow 教程 文本分类 IMDB电影评论的更多相关文章

  1. Pytorch文本分类(imdb数据集),含DataLoader数据加载,最优模型保存

    用pytorch进行文本分类,数据集为keras内置的imdb影评数据(二分类),代码包含六个部分(详见代码) 使用环境: pytorch:1.1.0 cuda:10.0 gpu:RTX2070 (1 ...

  2. 基于tensorflow的文本分类总结(数据集是复旦中文语料)

    代码已上传到github:https://github.com/taishan1994/tensorflow-text-classification 往期精彩: 利用TfidfVectorizer进行 ...

  3. 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 ...

  4. 使用RNN对文本进行分类实践电影评论

    本教程在IMDB大型影评数据集 上训练一个循环神经网络进行情感分类. from __future__ import absolute_import, division, print_function, ...

  5. kaggle之电影评论文本情感分类

    电影文本情感分类 Github地址 Kaggle地址 这个任务主要是对电影评论文本进行情感分类,主要分为正面评论和负面评论,所以是一个二分类问题,二分类模型我们可以选取一些常见的模型比如贝叶斯.逻辑回 ...

  6. 基于Keras的imdb数据集电影评论情感二分类

    IMDB数据集下载速度慢,可以在我的repo库中找到下载,下载后放到~/.keras/datasets/目录下,即可正常运行.)中找到下载,下载后放到~/.keras/datasets/目录下,即可正 ...

  7. AI - TensorFlow - 示例02:影评文本分类

    影评文本分类 文本分类(Text classification):https://www.tensorflow.org/tutorials/keras/basic_text_classificatio ...

  8. 在 TensorFlow 中实现文本分类的卷积神经网络

    在TensorFlow中实现文本分类的卷积神经网络 Github提供了完整的代码: https://github.com/dennybritz/cnn-text-classification-tf 在 ...

  9. tensorflow实现基于LSTM的文本分类方法

    tensorflow实现基于LSTM的文本分类方法 作者:u010223750 引言 学习一段时间的tensor flow之后,想找个项目试试手,然后想起了之前在看Theano教程中的一个文本分类的实 ...

随机推荐

  1. Mac终端下 连接 ubuntu 16.04 ssh root@*.*.*.* permission denied 问题解决方案

    默认 Ubuntu 不开启 ssh 服务 (1)检查是否开启SSH服务  命令:ps -e|grep ssh  查看SSH服务是否开启,或者通过命令:service sshd status 可以查看某 ...

  2. yii2.0里别名的定义

    别名用来表示文件路径和URL,为了避免在代码中硬编码一些绝对路径和URL,一个别名必须以‘@’符开头. 用Yii::setAlias()的方法来设置: //文件别名 Yii::setAlias('@f ...

  3. TP5:隐藏inde.php文件

    原文地址:https://www.cnblogs.com/wangjiayi/p/7943268.html 一,找到/public/.htaccess文件,如果你的入口文件已经移动到根目录下,那么你的 ...

  4. define常量

    看手册说define定义的常量只允许: 仅允许标量和 null.标量的类型是 integer, float,string 或者 boolean. 也能够定义常量值的类型为 resource ,但并不推 ...

  5. django+ajax用FileResponse文件下载到浏览器过程中遇到的问题

    问题: 公司的需求是从mongodb中查找数据并下载回本地,但是在将文件从mongodb通过django服务端,然后从django服务端向浏览器下载文件.但是在下载的时候出了些问题.由于是用的ajax ...

  6. BZOJ2005:[NOI2010]能量采集(莫比乌斯反演,欧拉函数)

    Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得 ...

  7. tmux分屏

    网上很多教程: 新手教程: tmux进入 ctrl + b 命令 % 纵向分屏 命令 方向键 切换 https://lukaszwrobel.pl/blog/tmux-tutorial-split-t ...

  8. PHP-------smaty 增删改查

    smaty 增删改查 smarty-----main文件夹,是放php文件的--------templates文件夹是放html文件的 我们访问的页面是php页面,PHP页面需要使用smarty模板, ...

  9. PHP------析构方法

    析 构 方 法 封装,有一个叫构造函数 和构造函数对应的还有一种方法叫做析构. class ren    //一个类 是 人类 { public $mingzi ://成员变量 punction__d ...

  10. 20165214 2018-2019-2 《网络对抗技术》Exp6 信息搜集与漏洞扫描 Week9

    <网络对抗技术>Exp6 信息搜集与漏洞扫描 Week9 一.实验目标与内容 1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 使用搜索 ...