定义模型

和softmax回归唯一的不同在于,我们多加了一个全连接层作为隐藏层。它的隐藏单元个数为256,并使用ReLU函数作为激活函数。

可以明显地发现,模型搭建及参数初始化极其简洁(无脑)

  1. import torch
  2. from torch import nn
  3. from torch.nn import init
  4. import d2lzh
  5. num_inputs, num_outputs, num_hiddens = 784, 10, 256
  6. net = nn.Sequential(
  7. d2lzh.FlattenLayer(),
  8. nn.Linear(num_inputs, num_hiddens),
  9. nn.ReLU(),
  10. nn.Linear(num_hiddens, num_outputs)
  11. )
  12. for params in net.parameters():
  13. init.normal_(params, mean=0, std=0.01)

读取数据并训练模型

由于这里使用的是PyTorch的SGD而不是d2lzh_pytorch里面的sgd,所以就不存在3.9节那样学习率看起来很大的问题了。

完整代码如下:

  1. import torch
  2. from torch import nn
  3. from torch.nn import init
  4. import d2lzh
  5. num_inputs, num_outputs, num_hiddens = 784, 10, 256
  6. net = nn.Sequential(
  7. d2lzh.FlattenLayer(),
  8. nn.Linear(num_inputs, num_hiddens),
  9. nn.ReLU(),
  10. nn.Linear(num_hiddens, num_outputs)
  11. )
  12. for params in net.parameters():
  13. init.normal_(params, mean=0, std=0.01)
  14. batch_size = 256
  15. train_iter, test_iter = d2lzh.load_data_fashion_mnist(batch_size)
  16. loss = torch.nn.CrossEntropyLoss()
  17. optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
  18. num_epochs = 5
  19. d2lzh.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None, None, optimizer)