本文正在参加「金石计划 . 分割6万现金大奖」
前语
本文主要是用 cpu 版别的 tensorflow 2.1 树立深度学习模型,完成对电影谈论的情感分类使命。 本次实践的数据来源于IMDB 数据集,里边的包括的是电影的影评,每条影评谈论文本分为活跃类型或消沉类型。数据集总共包括 50000 条影评文本,取该数据集的 25000 条影评数据作为练习集,别的 25000 条作为测验集,练习集与测验会集包括持平数量的活跃和消沉影评,确保数据质量的平衡。
本文纲要
- 下载影评数据并进行 padding 处理
- 创立验证集数据
- 树立简略的深度学习模型
- 装备并编译模型
- 练习模型
- 评价模型
完成过程和思路解析
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]