TensorFlow 2 中文文档 - IMDB 文本分类
TensorFlow2 文档系列文章链接:
- TensorFlow 2 / 2.0 中文文档 (Jul 9, 2019)
- TensorFlow 2 中文文档 - MNIST 图像分类 (Jul 9, 2019)
- TensorFlow 2 中文文档 - IMDB 文本分类 (Jul 9, 2019)
- TensorFlow 2 中文文档 - 特征工程结构化数据分类 (Jul 9, 2019)
- TensorFlow 2 中文文档 - 回归预测燃油效率 (Jul 11, 2019)
- TensorFlow 2 中文文档 - 过拟合与欠拟合 (Jul 12, 2019)
- TensorFlow 2 中文文档 - 保存与加载模型 (Jul 13, 2019)
- TensorFlow 2 中文文档 - 卷积神经网络分类 CIFAR-10 (Jul 19, 2019)
- TensorFlow 2 中文文档 - TFHub 迁移学习 (Jul 19, 2019)
- TensorFlow 2 中文文档 - RNN LSTM 文本分类 (Jul 22, 2019)
源代码/数据集已上传到 Github - tensorflow2-docs-zh
TF2.0 TensorFlow 2 / 2.0 中文文档 - 文本分类 Classify text
主要内容:使用迁移学习算法解决一个典型的二分分类(Binary Classification)问题——电影正向评论和负向评论分类。
这篇文档使用包含有50,000条电影评论的 IMDB 数据集,25,000用于训练,25,000用于测试。而且训练集和测试集是均衡的,即其中包含同等数量的正向评论和负向评论。
代码使用tf.keras
和TensorFlow Hub
,TensorFlow Hub 是一个用于迁移学习的平台/库。
1 | import numpy as np |
下载 IMDB 数据集
IMDB 数据集在tfds
中是可以直接获取的,调用时会自动下载到你的机器上。
1 | # 进一步划分训练集。 |
数据格式
每个例子包含一句电影评论和对应的标签,0或1。0代表负向评论,1代表正向评论。
看一下前十条数据。
1 | train_examples_batch, train_labels_batch = next(iter(train_data.batch(10))) |
1 | <tf.Tensor: id=220, shape=(10,), dtype=string, numpy= |
前十个标签。
1 | train_labels_batch |
搭建模型
神经网络需要堆叠多层,架构上需要考虑三点。
- 文本怎么表示?
- 模型需要多少层?
- 每一层多少个_隐藏节点_
一种表示文本的方式是将句子映射为向量(embeddings vectors),或者称为文本嵌入(text embedding)。嵌入方法很多,比如我们可以采用最简单的独热编码,假设常用单词总共1000个,给每一个单词一个独热编码。假设每句话由10个单词构成,那么每句话均可以映射到10x1000的二维空间中。那么某句话就可以表示为:
1 | # 10x1000的二维向量表示一句话 |
文本嵌入的方法很多,要考虑的因素也很多,比如同义词如何处理,维度过高怎么办?知乎上有比较详细的回答:word embedding的解释。
我们可以使用一个预训练(pre-trained)好的文本嵌入模型作为第一层,有3个好处。
- 不用担心文本处理。
- 能从迁移学习中受益。
- 嵌入后size固定,处理起来简单。
接下来从 TensorFlow Hub 中选用的pre-trained 文本嵌入模型称为google/tf2-preview/gnews-swivel-20dim/1。
接下来创建一个 Keras Layer 使用这个模型将句子转为向量。取前三条评论试一试。注意无论句子的长度如何,最终的嵌入结果均为长度20的一维向量。
1 | embedding = "https://tfhub.dev/google/tf2-preview/gnews-swivel-20dim/1" |
1 | <tf.Tensor: id=402, shape=(3, 20), dtype=float32, numpy= |
接下来,搭建完整的神经网络模型。
1 | model = tf.keras.Sequential() |
1 | Model: "sequential" |
- 第一层是 TensorFlow Hub 层,将句子转换为 tokens,然后映射每个 token,并组合成最终的向量。输出的维度是:句子个数 * 嵌入维度(20)。
- 接下来是全连接层(Full-connected, FC),即
Dense
层,16个节点。 - 最后一层,也是全连接层,只有一个节点。使用
sigmoid
激活函数,输出值是float,范围0-1,代表可能性/置信度。
损失函数和优化器
binary_crossentropy
更适合处理概率问题,mean_squared_error
适合处理回归(Regression)问题。
1 | model.compile(optimizer='adam', |
训练模型
共 20 epochs,每个batch 512个数据。即对所有训练数据进行20轮迭代。在训练过程中,将监视模型在包含10,000条数据的验证集上的损失(loss)和正确率(accuracy)。
1 | history = model.fit(train_data.shuffle(10000).batch(512), |
1 | Epoch 1/20 |
评估模型
evaluate
返回2个值,Loss(误差,越小越好) 和 accuracy。
1 | results = model.evaluate(test_data.batch(512), verbose=0) |
这个非常基础的模型达到了87%的正确率,复杂一点的模型可以达到95%。
返回文档首页
参考地址:Text classification of movie reviews with Keras and TensorFlow Hub
附 推荐
- 一篇文章入门 Python
专题: TensorFlow2 文档
本文发表于 2019-07-09,最后修改于 2022-09-09。
本站永久域名「 geektutu.com 」,也可搜索「 极客兔兔 」找到我。
上一篇 « TensorFlow 2 中文文档 - MNIST 图像分类 下一篇 » TensorFlow 2 中文文档 - 特征工程结构化数据分类