Участвуйте в 16-м дне Ноябрьского испытания обновлений, узнайте подробности события:Вызов последнего обновления 2021 г.
import torch
from torch import nn
from d2l import torch as d2l
def dropout_layer(X, dropout):
assert 0 <= dropout <= 1
# 在本情况中,所有元素都被丢弃。
if dropout == 1:
return torch.zeros_like(X)
# 在本情况中,所有元素都被保留。
if dropout == 0:
return X
mask = (torch.Tensor(X.shape).uniform_(0, 1) > dropout).float()
return mask * X / (1.0 - dropout)
-
assert используется для проверки выражения и запуска исключения, если условие выражения ложно. Утверждения могут напрямую возвращать ошибку, если условие не выполняется при запуске программы, не дожидаясь сбоя программы после запуска.
То есть, если выпадение не находится между 0-1, возвращать ошибку напрямую.
-
mask = (torch.Tensor(X.shape).uniform_(0, 1) > dropout).float()
-
torch.Tensor(X.shape).uniform_(0, 1)
Генерировать числа с плавающей запятой между [0,1].увидеть больше здесьРазличные случайные числа pytorch | связь между randn и normal | rand и uniform_ - самородки (juejin.cn)
-
> dropout
состоит в том, чтобы сравнить сгенерированную матрицу случайных чисел с отсевом и вернуть логический тензор. -
.float()
Преобразуйте его в значение 0 или 1 -
Наконец, верните матрицу отсева
-
num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256, 256
Это знакомо?ДНК переместился, и используется набор данных Fashion-MNIST:Практическое глубокое обучение 3.4 — Чтение наборов данных изображений.
Вот эта модель输入层-隐藏层1-隐藏层2-输出层
dropout1, dropout2 = 0.2, 0.5
class Net(nn.Module):
def __init__(self, num_inputs, num_outputs, num_hiddens1, num_hiddens2,
is_training = True):
super(Net, self).__init__()
self.num_inputs = num_inputs
self.training = is_training
self.lin1 = nn.Linear(num_inputs, num_hiddens1)
self.lin2 = nn.Linear(num_hiddens1, num_hiddens2)
self.lin3 = nn.Linear(num_hiddens2, num_outputs)
self.relu = nn.ReLU()
def forward(self, X):
H1 = self.relu(self.lin1(X.reshape((-1, self.num_inputs))))
# 只有在训练模型时才使用dropout
if self.training == True:
# 在第一个全连接层之后添加一个dropout层
H1 = dropout_layer(H1, dropout1)
H2 = self.relu(self.lin2(H1))
if self.training == True:
# 在第二个全连接层之后添加一个dropout层
H2 = dropout_layer(H2, dropout2)
out = self.lin3(H2)
return out
net = Net(num_inputs, num_outputs, num_hiddens1, num_hiddens2)
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)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
- Сначала определите класс Net, который наследует nn.Module, нет необходимости объяснять его подробно, теперь вы должны понять его.
- в функции прямого распространения
- Скрытый слой 1 выполняет ReLU, а затем отсев
- Скрытый уровень 2 выполняет ReLU, а затем отсев
- в функции прямого распространения
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)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
Я чувствую себя здесь, и этот код не нуждается в объяснении на уровне няни. Но позвольте мне объяснить...
- Установите количество итераций обучения, скорость обучения, размер пакета
- потеря использует перекрестную энтропию
- чтение набора данных
- тренироваться
Окончательный результат показан на рисунке:
Подробнее о серии «Практическое глубокое обучение» см. здесь:«Практическое глубокое обучение» — Колонка LolitaAnn — Nuggets (juejin.cn)
Заметки все еще обновляются......