Практическое глубокое обучение 4.6 простая реализация отсева

PyTorch

Участвуйте в 16-м дне Ноябрьского испытания обновлений, узнайте подробности события:Вызов последнего обновления 2021 г.

import torch
from torch import nn
from d2l import torch as d2l
dropout1, dropout2 = 0.2, 0.5

net = nn.Sequential(nn.Flatten(),
        nn.Linear(784, 256),
        nn.ReLU(),
        # 在第一个全连接层之后添加一个dropout层
        nn.Dropout(dropout1),
        nn.Linear(256, 256),
        nn.ReLU(),
        # 在第二个全连接层之后添加一个dropout层
        nn.Dropout(dropout2),
        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)

Модель выглядит так:

Sequential(
  (0): Flatten(start_dim=1, end_dim=-1)
  (1): Linear(in_features=784, out_features=256, bias=True)
  (2): ReLU()
  (3): Dropout(p=0.2, inplace=False)
  (4): Linear(in_features=256, out_features=256, bias=True)
  (5): ReLU()
  (6): Dropout(p=0.5, inplace=False)
  (7): Linear(in_features=256, out_features=10, bias=True)
)
  • (0): Обработка ввода, то есть 28*28 сглаживается до вектора 784.
  • (1): первый слой является входным слоем
  • (2): Добавьте функцию активации ReLU() на первый слой.
  • (3): Исключить первый слой, где p = 0,2
  • (4): Скрытый слой 1 представляет собой вектор 256
  • (5): Добавьте функцию активации ReLU() в скрытый слой 1.
  • (6): Исключение на скрытом слое 1, где p = 0,5.
  • (7): Скрытый слой 2 — это вектор из 256, а выходной слой — это 10 категорий.

Для p этого скрытого слоя он подчиняется следующей формуле:

E[xi']=p0+(1p)xi1p=xi\begin{aligned} E\left[x_{i}'\right] &=p \cdot 0+(1-p) \frac{x_{i}}{1-p} =x_{i} \end{aligned}

Для входного слоя в скрытый слой 1:

E(h11')=0.2×0+(10.2)h1110.2=h11E\left(h_{11}^{\prime}\right)=0.2 \times 0+(1-0.2) \frac{h_{11}}{1-0.2}=h_{11}

Для скрытого слоя 1 до скрытого слоя 2 это:

E(h21')=0.5×0+(10.5)h2110.5=h11E\left(h_{21}^{\prime}\right)=0.5 \times 0+(1-0.5) \frac{h_{21}}{1-0.5}=h_{11}

num_epochs, lr, batch_size = 10, 0.5, 256
loss = nn.CrossEntropyLoss()
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
trainer = torch.optim.SGD(net.parameters(), lr=lr)

trainer = torch.optim.SGD(net.parameters(), lr=lr)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)

этот код иПрактическое глубокое обучение 4.6 ручная реализация отсеваВнутри то же самое.

  • Установите количество итераций обучения, скорость обучения, размер пакета
  • потеря использует перекрестную энтропию
  • чтение набора данных
  • тренироваться

Повторюсь, может показаться, что между ручным выполнением и этим мало разницы, не просто сделать Sequential самостоятельно, но при работе с массивными данными настройка библиотеки быстрее и эффективнее, чем собственный почерк.

Ручная реализация заключается в понимании принципа, а краткая реализация — в повышении эффективности.


Подробнее о серии «Практическое глубокое обучение» см. здесь:«Практическое глубокое обучение» — Колонка LolitaAnn — Nuggets (juejin.cn)

Заметки все еще обновляются......