Deep Learning With Keras 简明教程

Deep Learning with Keras - Preparing Data

在将数据馈送到我们的网络之前,必须将其转换为网络所需的格式。这称为为网络准备数据。它通常包括将多维输入转换为单维矢量并标准化数据点。

Reshaping Input Vector

我们数据集中的图像由 28 x 28 像素组成。在将其馈送到我们的网络之前,这必须转换为大小为 28 * 28 = 784 的单维矢量。我们通过在矢量上调用 reshape 方法来执行此操作。

X_train = X_train.reshape(60000, 784)
X_test = X_test.reshape(10000, 784)

现在,我们的训练矢量将包含 60000 个数据点,每个数据点都包含大小为 784 的单维矢量。类似地,我们的测试矢量将包含 10000 个数据点,每个数据点都是大小为 784 的单维矢量。

Normalizing Data

输入矢量当前包含的数据在 0 和 255 之间的离散值——灰度级。将这些像素值标准化到 0 和 1 之间有助于加快训练速度。由于我们要使用随机梯度下降,标准化数据还有助于降低陷入局部最优的可能性。

要标准化数据,我们将其表示为浮点类型,并除以 255,如以下代码片段中所示:

X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

让我们现在看看标准化数据的样子。

Examining Normalized Data

要查看标准化数据,我们将调用直方图函数,如下所示:

plot.hist(X_train[0])
plot.title("Digit: {}".format(y_train[0]))

在这里,我们绘制 X_train 函数的第一个元素的直方图。我们还打印此数据点表示的数字。运行以上代码的输出显示如下:

normalized data

您会注意到,大量密点数的值接近于零。这些是图像中的黑色圆点,显然是图像的主要部分。其余靠近白色的灰度级点代表数字。您可以查看另一个数字的像素分布。以下代码打印训练集中索引为 2 的数字的直方图。

plot.hist(X_train[2])
plot.title("Digit: {}".format(y_train[2])

运行以上代码的输出显示如下:

training dataset

比较以上两幅图,您会注意到两幅图像中白色像素的分布不同,表示不同的数字——上方两幅图像中的“5”和“4”。

接下来,我们将检查我们整个训练集中数据的分布。

Examining Data Distribution

在我们的机器学习模型针对我们的数据集进行训练之前,我们应该知道我们数据集中唯一数字的分布。我们的图像表示了从 0 到 9 的 10 个不同的数字。我们想知道我们数据集中数字 0、1 等的数量。我们可以使用 NumPy 的 unique 方法获取此信息。

使用以下命令打印唯一值的数目及每个数字出现的次数:

print(np.unique(y_train, return_counts=True))

运行上述命令后,您将看到以下输出:

(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8), array([5923, 6742, 5958, 6131, 5842, 5421, 5918, 6265, 5851, 5949]))

它表明有 10 个不同的值——0 到 9。数字 0 出现 5923 次,数字 1 出现 6742 次,依此类推。输出的屏幕截图显示如下:

distinct values

作为数据准备的最后一步,我们需要对数据进行编码。

Encoding Data

我们的数据集中有十个类别。因此,我们使用独热编码将我们的输出编码到这十个类别中。我们使用 Numpy 实用程序的 to_categorial 方法来执行编码。对输出数据进行编码后,每个数据点都会转换为大小为 10 的单维向量。例如,数字 5 现在将表示为 [0,0,0,0,0,1,0,0,0,0]。

使用以下代码段对数据进行编码 -

n_classes = 10
Y_train = np_utils.to_categorical(y_train, n_classes)

您可以通过打印分类的 Y_train 向量的前 5 个元素来查看编码结果。

使用以下代码打印前 5 个向量 -

for i in range(5):
   print (Y_train[i])

您将看到以下输出 −

[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

第一个元素代表数字 5,第二个元素代表数字 0,依此类推。

最后,您还必须对测试数据进行分类,该操作使用以下语句完成 -

Y_test = np_utils.to_categorical(y_test, n_classes)

在此阶段,您的数据已完全准备好馈送到网络中。

接下来,是最重要的部分,即训练我们的网络模型。