Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

4.3 Краткая реализация многослойного перцептрона

В этом разделе мы покажем, как реализовать многослойный перцептрон короче, с помощью высокоуровневого API.

MXNet:

from d2l import mxnet as d2l
from mxnet import gluon, init, npx
from mxnet.gluon import nn
npx.set_np()

PyTorch:

from d2l import torch as d2l
import torch
from torch import nn

TensorFlow:

from d2l import tensorflow as d2l
import tensorflow as tf

PaddlePaddle:

from d2l import paddle as d2l
import warnings
warnings.filterwarnings("ignore")
import paddle
from paddle import nn

4.3.1 Модель

По сравнению с краткой реализацией softmax-регрессии (раздел 3.7) здесь есть одно отличие: мы добавляем два полносвязных слоя вместо одного. Первый слой — скрытый слой, который содержит 256 скрытых нейронов и использует функцию активации ReLU. Второй слой — выходной.

MXNet:

net = nn.Sequential()
net.add(nn.Dense(256, activation='relu'),
        nn.Dense(10))
net.initialize(init.Normal(sigma=0.01))

PyTorch:

net = nn.Sequential(nn.Flatten(),
                    nn.Linear(784, 256),
                    nn.ReLU(),
                    nn.Linear(256, 10))

def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)

net.apply(init_weights);

TensorFlow:

net = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dense(10)])

PaddlePaddle:

net = nn.Sequential(nn.Flatten(),
                    nn.Linear(784, 256),
                    nn.ReLU(),
                    nn.Linear(256, 10))


for layer in net:
    if type(layer) == nn.Linear:
        weight_attr = paddle.framework.ParamAttr(initializer=paddle.nn.initializer.Normal(mean=0.0, std=0.01))
        layer.weight_attr = weight_attr

Процесс обучения реализуется точно так же, как при реализации softmax-регрессии. Такое модульное устройство позволяет отделить всё, что относится к архитектуре модели, от остального.

MXNet:

batch_size, lr, num_epochs = 256, 0.1, 10
loss = gluon.loss.SoftmaxCrossEntropyLoss()
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': lr})

PyTorch:

batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(), lr=lr)

TensorFlow:

batch_size, lr, num_epochs = 256, 0.1, 10
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
trainer = tf.keras.optimizers.SGD(learning_rate=lr)

PaddlePaddle:

batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss(reduction='none')
trainer = paddle.optimizer.SGD(parameters=net.parameters(), learning_rate=lr)
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

Резюме

  • Многослойный перцептрон можно реализовать с помощью высокоуровневого API существенно короче.
  • Для одной и той же задачи классификации реализация многослойного перцептрона совпадает с реализацией softmax-регрессии, за исключением того, что в многослойном перцептроне добавляется скрытый слой с функцией активации.

Упражнения

  1. Попробуйте добавить разное число скрытых слоёв (можно также менять скорость обучения). Какая настройка даёт лучший результат?
  2. Попробуйте разные функции активации. Какая из них работает лучше всего?
  3. Попробуйте разные способы инициализации весов. Какой метод работает лучше всего?

MXNet: Обсуждение

PyTorch: Обсуждение

TensorFlow: Обсуждение

PaddlePaddle: Обсуждение