<aside> 📢
在这篇笔记中,我们将通过对三个经典的神经网络项目(IMDB电影评论二分类问题、Reuters新闻主题多分类问题以及Boston房价预测问题)进行实现来加深理解神经网络的工作原理,其中依赖的环境为Python下的Keras深度学习框架。
</aside>
我们知道,神经网络的训练主要围绕如下四个方面:
若干层连接组合在一起构成网络,输入数据经过一系列层的处理后得到预测值,然后损失函数将预测值与预期目标值进行比较得到损失值,损失值用来衡量预测值与预期目标值之间的差异程度,接着优化器使用这个损失值来更新网络的参数,通过不断重复上述过程直至得到的损失值符合我们的要求。所以我们在编程设计网络模型时也就是围绕着这四个方面进行功能实现。

在这个问题中,我们使用的数据集为IMDB数据集,它包含来自互联网电影数据库(IMDB)的50,000条严重两极分化的评论,数据集被分为用于训练的25,000条评论和用于测试的25,000条评论,其中训练集和测试集都包含50%的正面评论(Positive)与50%的负面评论(Negative)。我们的目标是根据电影评论中的文字内容将其划分为正面或者负面。
IMDB数据集内置在Keras库中,它已经经过了将电影评论(英文单词序列)转换为整数序列的预处理,其中每个整数代表字典中的某个单词(做这一步的原因是计算机处理数要比处理语言文字快捷方便得多)。我们在第一次调用它时会下载这个大约80MB的数据集。

**https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb_word_index.json**
接下来我们构建相关的神经网络来实现二分类的目标,具体的构建思路便是上文提到的四个方面。
# Import the relevant libraries (install them by yourself in advance)
import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras.datasets import imdb
from tensorflow.keras import layers
from tensorflow.keras import optimizers
from tensorflow.keras import losses
from tensorflow.keras import metrics
# Data overviewing and preparing
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
word_index = imdb.get_word_index()
reverse_word_index = dict(
[(value, key) for (key, value) in word_index.items()]
)
decoded_review = " ".join(
[reverse_word_index.get(i - 3, "?") for i in train_data[0]]
)
def vectorize_sequences(sequences, dimension=10000):
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
for j in sequence:
results[i, j] = 1.
return results
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)
y_train = np.asarray(train_labels).astype("float32")
y_test = np.asarray(test_labels).astype("float32")
代码中的参数num_words=10000表示保留训练数据中前10,000个最常出现的单词,舍弃低频单词,这样得到的向量数据不至于太大,方便计算机进行运算和处理;由于将单词范围限制在了前10,000个,故单词索引不会超过9,999。
train_data和test_data这两个变量都是由评论组成的列表,每条评论又是单词索引组成的列表(表示一系列单词);train_labels和test_labels都是由0和1组成的列表,其中0代表Negative,1代表Positive。