有了前面的经验,多层感知机的实现过程也是类似的。只挑差异大的部分记录一下。

    • 定义模型参数

    因为用到了多层网络,所以有两组3.9 多层感知机的从零开始实现 - 图1
    隐藏层的神经元个数也是一个 超参数 ,这里跟着作者设。

    1. # 定义模型参数
    2. input_size, hidden_size, output_size = 784, 256, 10
    3. elem_type = torch.float32
    4. w1 = torch.normal(0, 0.01, (input_size, hidden_size), dtype=elem_type, requires_grad=True)
    5. b1 = torch.zeros(hidden_size, dtype=elem_type, requires_grad=True)
    6. w2 = torch.normal(0, 0.01, (hidden_size, output_size), dtype=elem_type, requires_grad=True)
    7. b2 = torch.zeros(output_size, dtype=elem_type, requires_grad=True)
    8. params = [w1, b1, w2, b2]
    • 定义激活函数

    先不用自带的,自己简单实现一下。

    1. # 定义激活函数
    2. def relu(x):
    3. """
    4. 对 x 进行 relu 运算
    5. Args:
    6. x: 原始数值
    7. Returns:
    8. Raises:
    9. """
    10. return torch.max(input=x, other=torch.tensor(0.0))
    • 定义模型

    多层网络,数值的传递过程也稍稍麻烦一点

    1. # 定义模型
    2. def net(x):
    3. """
    4. 对 x 进行 relu 运算
    5. Args:
    6. x: 原始数值
    7. Returns:
    8. Raises:
    9. """
    10. input_layer = x.view((-1, input_size))
    11. hidden_layer = relu(torch.matmul(input_layer, w1) + b1)
    12. output_layer = torch.matmul(hidden_layer, w2) + b2
    13. return output_layer
    • 学习率

    一开始我自己定了 0.1 的学习率,然后发现正确率极低。然后发现作者备注说涉及到数值计算时求和还是求平均的选择,因为我这里用了PyTorch的损失函数和作者提供的优化器,有点不伦不类的,把 lr 改大些就正常了。3.9 多层感知机的从零开始实现.py