Участвуйте в 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 этого скрытого слоя он подчиняется следующей формуле:
Для входного слоя в скрытый слой 1:
Для скрытого слоя 1 до скрытого слоя 2 это:
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)
Заметки все еще обновляются......