本文正在参加「金石计划 . 分割6万现金大奖」

前语

本文主要是用 cpu 版别的 tensorflow 2.1 树立深度学习模型,完成对电影谈论的情感分类使命。 本次实践的数据来源于IMDB 数据集,里边的包括的是电影的影评,每条影评谈论文本分为活跃类型或消沉类型。数据集总共包括 50000 条影评文本,取该数据集的 25000 条影评数据作为练习集,别的 25000 条作为测验集,练习集与测验会集包括持平数量的活跃和消沉影评,确保数据质量的平衡。

本文纲要

  1. 下载影评数据并进行 padding 处理
  2. 创立验证集数据
  3. 树立简略的深度学习模型
  4. 装备并编译模型
  5. 练习模型
  6. 评价模型

完成过程和思路解析

1. 下载影评数据并进行 padding 处理

(1)这儿主要是经过 tf 内置的接口从网络上下载 imdb 数据,该数据是现已经过处理的,每一条谈论中的每个单词都是用对应的整数表明的,所以每一条谈论都是一个整数列表。而对应的每条影评的标签是一个 0 或 1 的整数, 0 代表的是消沉谈论,1 代表的是活跃谈论。

(2)这儿的 num_words=6000 表明咱们只需求保留了练习数据中呈现频率最高的 6000 个常用单词,低频词会被悉数弃用,由于一方面这些低频词可能是些符号或者停用词,对影评情感分类没有意义,另一方面假如低频词太多,需求构造的词典太过庞大,严重影响计算效率,且消耗大量内存。

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

(3)这儿主要是树立整数与单词之间的映射联系,并树立了一个函数 decode_review 能够将影评数据从数字序列转化回单词序列。

word_index = imdb.get_word_index()
word_index = {k:(v+3) for k,v in word_index.items()}
word_index["<PAD>"] = 0
word_index["<START>"] = 1
word_index["<UNK>"] = 2  # unknown
word_index["<UNUSED>"] = 3
index_word = dict([(value, key) for (key, value) in word_index.items()])
def decode_review(text):
    return ' '.join([index_word.get(i, '?') for i in text])

(4)这儿主要是对影评数据进行填充,由于每条数据的长度(数字序列的长度)是不一致的,而要进行深度学习模型的输入必须要确保每条影评数据的长度持平,所以咱们要进行填充操作,指定了最大的影评长度 maxlen 为 256 ,假如超过 256 则进行截断,假如缺乏 256 则用 0 (也便是<PAD>对应的整数)在末尾进行填充。这儿的 maxlen 能够随意指定,可是其长度会影响模型的效果,需求在实践中不断调整折中。

train_data = keras.preprocessing.sequence.pad_sequences(train_data, value=word_index["<PAD>"], padding='post', maxlen=256)
val_data = keras.preprocessing.sequence.pad_sequences(val_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)

2. 创立验证集数据

这儿主要是创立验证集,那么有了练习集为什么要创立验证集呢?首先咱们要知道练习集数据是用来开发和调整模型的,而检查模型的准确率目标只能是用未见过的数据进行评测,所以咱们从原始的练习数据中抽取出 10000 个样原本创立验证集,此时练习样本只有 15000 个,咱们结合运用练习集和验证集共同调整和开发模型,当模型定型之后,最终需求运用一次测验集评价模型的实际运用效果即可。

val_data = train_data[:10000]
val_labels = train_labels[:10000]
train_data = train_data[10000:]
train_labels = train_labels[10000:]

3. 树立简略的深度学习模型

(1)第一层是 Embedding 层,它将输入的每一个单词转化为一个 32 维的向量,所以每一个样本输入就从一维的 (sequence) 变成了二维的 (sequence, 32)

(2)第二层主要是运用了平均池化操作 GlobalAveragePooling1D , 此操作能够将每个样本的二维维度向量 (sequence, 32) 又压缩成一维向量 (32) ,上一步中的 32 维向量表明的是每个单词向量,可是这儿的 32 维向量表明的是一个影评样本向量。

(3)第三层是一个经过 relu 激活函数将输入转化成输出为 16 维度向量的全衔接层操作

(4)第四层是一个经过 sigmoid 激活函数将输入转化成输出为 1 维度向量的全衔接层操作,也便是最终输出一个介于 0 与 1 之间的浮点数,它表明了概率,惯例情况下假如概率大于等于 0.5 则说明该样本猜测类别为 1 ,不然说明该样本猜测类别为 0

model = keras.Sequential()
model.add(keras.layers.Embedding(num_words, 32))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16 , activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.summary()

4. 装备并编译模型

(1)咱们挑选了常用的 Adam 优化器,你也能够自行挑选其他优化器。

(2)由于这是一个二分类问题且模型会输出一个概率值,咱们挑选了常见的 binary_crossentropy 丢失函数。

(3)评价目标咱们挑选了最容易理解的准确率 accuracy 。

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

5. 练习模型

这儿主要是运用练习数据进行模型的练习,运用练习集重复进行 40 次模型练习,并且在练习过程中,运用验证集的 10000 个样原本评价模型上的丢失值(loss)和准确率(accuracy)。

model.fit(train_data, train_labels, epochs=40, batch_size=512, validation_data=(val_data, val_labels), verbose=1)

输出如下所示:

Train on 15000 samples, validate on 10000 samples
Epoch 1/40
15000/15000 [==============================] - 3s 169us/sample - loss: 0.6913 - accuracy: 0.5465 - val_loss: 0.6881 - val_accuracy: 0.6872
Epoch 2/40
15000/15000 [==============================] - 1s 88us/sample - loss: 0.6815 - accuracy: 0.7043 - val_loss: 0.6732 - val_accuracy: 0.7427
Epoch 3/40
...
Epoch 38/40
15000/15000 [==============================] - 1s 79us/sample - loss: 0.1045 - accuracy: 0.9707 - val_loss: 0.3431 - val_accuracy: 0.8738
Epoch 39/40
15000/15000 [==============================] - 1s 76us/sample - loss: 0.1022 - accuracy: 0.9712 - val_loss: 0.3470 - val_accuracy: 0.8737
Epoch 40/40
15000/15000 [==============================] - 1s 77us/sample - loss: 0.0985 - accuracy: 0.9735 - val_loss: 0.3526 - val_accuracy: 0.8725

6. 评价模型

这儿主要是运用测验数据对模型进行评价,由于当前模型较为简略,假如运用复杂的模型和更好的练习方法,准确率应该能到达 98% 以上.

model.evaluate(test_data,  test_labels, verbose=2)

结果输出为,丢失为 0.368 ,准确率为 0.86488 :

[0.368153291721344, 0.86488]
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。