.. _sec_mlp_concise:
Thực hiện ngắn gọn của Multilayer Perceptrons
=============================================
Như bạn có thể mong đợi, bằng cách dựa vào các API cấp cao, chúng tôi có
thể triển khai MLP thậm chí còn ngắn gọn hơn.
.. raw:: html
.. raw:: html
.. code:: python
from mxnet import gluon, init, npx
from mxnet.gluon import nn
from d2l import mxnet as d2l
npx.set_np()
.. raw:: html
.. raw:: html
.. code:: python
import torch
from torch import nn
from d2l import torch as d2l
.. raw:: html
.. raw:: html
.. code:: python
import tensorflow as tf
from d2l import tensorflow as d2l
.. raw:: html
.. raw:: html
Mô hình
-------
So với việc thực hiện súc tích của chúng tôi về triển khai hồi quy
softmax (:numref:`sec_softmax_concise`), sự khác biệt duy nhất là
chúng tôi thêm *hai* lớp được kết nối hoàn toàn (trước đây, chúng tôi đã
thêm \* một\*). Đầu tiên là lớp ẩn của chúng tôi, chứa 256 đơn vị ẩn và
áp dụng chức năng kích hoạt ReLU. Thứ hai là lớp đầu ra của chúng tôi.
.. raw:: html
.. raw:: html
.. code:: python
net = nn.Sequential()
net.add(nn.Dense(256, activation='relu'),
nn.Dense(10))
net.initialize(init.Normal(sigma=0.01))
.. raw:: html
.. raw:: html
.. code:: python
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);
.. raw:: html
.. raw:: html
.. code:: python
net = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(256, activation='relu'),
tf.keras.layers.Dense(10)])
.. raw:: html
.. raw:: html
Vòng đào tạo chính xác giống như khi chúng tôi thực hiện hồi quy
softmax. Mô đun này cho phép chúng ta tách các vấn đề liên quan đến kiến
trúc mô hình khỏi các cân nhắc trực giao.
.. raw:: html
.. raw:: html
.. code:: python
batch_size, lr, num_epochs = 256, 0.1, 10
loss = gluon.loss.SoftmaxCrossEntropyLoss()
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'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)
.. figure:: output_mlp-concise_f87756_27_0.svg
.. raw:: html
.. raw:: html
.. code:: python
batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(), lr=lr)
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
.. figure:: output_mlp-concise_f87756_30_0.svg
.. raw:: html
.. raw:: html
.. code:: python
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)
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
.. figure:: output_mlp-concise_f87756_33_0.svg
.. raw:: html
.. raw:: html
Tóm tắt
-------
- Sử dụng API cấp cao, chúng ta có thể triển khai MLP chính xác hơn
nhiều.
- Đối với bài toán phân loại tương tự, việc thực hiện một MLP giống như
của hồi quy softmax ngoại trừ các lớp ẩn bổ sung có hàm kích hoạt.
Bài tập
-------
1. Hãy thử thêm các số lớp ẩn khác nhau (bạn cũng có thể sửa đổi tốc độ
học tập). Cài đặt nào hoạt động tốt nhất?
2. Hãy thử các chức năng kích hoạt khác nhau. Cái nào hoạt động tốt
nhất?
3. Hãy thử các sơ đồ khác nhau để khởi tạo các trọng lượng. Phương pháp
nào hoạt động tốt nhất?
.. raw:: html
.. raw:: html
`Discussions `__
.. raw:: html
.. raw:: html
`Discussions `__
.. raw:: html
.. raw:: html
`Discussions `__
.. raw:: html
.. raw:: html