零基础学习机器学习(十一)多层感知机的从零开始实现
现在让我们尝试自己实现一个多层感知机。 为了与之前softmax回归获得的结果进行比较, 我们将继续使用Fashion-MNIST图像分类数据集。
初始化模型参数
回想一下,Fashion-MNIST中的每个图像由 个灰度像素值组成。 所有图像共分为10个类别。 忽略像素之间的空间结构, 我们可以将每个图像视为具有784个输入特征 和10个类的简单分类数据集。 首先,我们将实现一个具有单隐藏层的多层感知机, 它包含256个隐藏单元。 注意,我们可以将这两个变量都视为超参数。 通常,我们选择2的若干次幂作为层的宽度。 因为内存在硬件中的分配和寻址方式,这么做往往可以在计算上更高效。
我们用几个张量来表示我们的参数。 注意,对于每一层我们都要记录一个权重矩阵和一个偏置向量。 跟以前一样,我们要为损失关于这些参数的梯度分配内存。
1 | num_inputs, num_outputs, num_hiddens = 784, 10, 256 |
激活函数
我们将实现ReLU激活函数, 而不是直接调用内置的relu函数。
1 | def relu(X): |
模型
因为我们忽略了空间结构, 所以我们使用reshape将每个二维图像转换为一个长度为num_inputs的向量。 只需几行代码就可以实现我们的模型。
1 | def net(X): |
损失函数
由于我们已经从零实现过softmax函数( 3.6节), 因此在这里我们直接使用高级API中的内置函数来计算softmax和交叉熵损失。
1 | loss = nn.CrossEntropyLoss(reduction='none') |
训练
幸运的是,多层感知机的训练过程与softmax回归的训练过程完全相同。可以直接用之前博客的train_ch3函数
1 | num_epochs, lr = 10, 0.1 |
为了对学习到的模型进行评估,我们将在一些测试数据上应用这个模型。
1 | d2l.predict_ch3(net, test_iter) |