Участвуйте в 10-м дне Ноябрьского испытания обновлений, узнайте подробности события:Вызов последнего обновления 2021 г.
import torch
from torch import nn
from d2l import torch as d2l
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
Обратитесь к статье, которая реализует регрессию softmax вручную:Практическое глубокое обучение 3.6 — ручная реализация регрессии softmax — самородки (juejin.cn)
Здесь будет предупреждение пользователя, вы можете просто игнорировать его, если вы действительно хотите знать, что это такоеtorchvision.transforms.ToTensor details | Предупреждение пользователя при использовании transforms.ToTensor() | Что представляет изображение HW C
net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10))
def init_weights(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight, std=0.01)
net.apply(init_weights);
-
nn.Flatten()
: PyTorch не изменяет форму входных данных неявным образом, поэтому слой сглаживания определяется перед линейным слоем для изменения формы входных данных.nn.Linear(784, 10)
Укажите размерность ввода и размерность вывода и обрабатывайте по одному изображению за раз.Известное изображение имеет размер 28*28, а при преобразовании в вектор оно равно 784. -
net.apply(init_weights)
Примените эту функцию к каждому слою сетиinit_weights
: эта функция- Определить, является ли полученный слой nn.Linear, конечно
type(m) == nn.Linear
Вы также можете использовать ранее упомянутыйisinstance(m,nn.Linear)
- Если это так, инициализируйте веса слоев, чтобы установить среднее значение на 0 и дисперсию на 0,01.
- Определить, является ли полученный слой nn.Linear, конечно
loss = nn.CrossEntropyLoss()
trainer = torch.optim.SGD(net.parameters(), lr=0.1)
Потеря напрямую использует потерю перекрестной энтропии, которая идет с nn, и тренер также напрямую использует функцию SGD, которая идет с nn. для перекрестной энтропии.
num_epochs = 10
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
Эта функция обучения является функцией обучения, описанной в предыдущем разделе, поэтому она не будет перемещена сюда. ВидетьПрактическое глубокое обучение 3.6 — ручная реализация регрессии softmax — самородки (juejin.cn)
Softmax
Softmax, реализованный в предыдущем разделе, использует:
функция softmax,вявляется прогнозируемым распределением вероятностей.это ненормализованный прогнозПервыйэлементы. еслиНекоторые значения в очень велики, тогдаможет быть больше, чем максимальное число, разрешенное типом данных (т.е.переполнение(переполнение)). Это заставит знаменатель или числитель статьinf
(бесконечность), мы получаем 0,inf
илиnan
(не число). В этих случаях мы не можем получить четко определенное возвращаемое значение кросс-энтропии.
Уловка для решения этой проблемы состоит в том, чтобы начать со всехвычесть. вы можете доказать каждомуПеремещение на константу не меняет возвращаемое значение softmax. После шагов вычитания и нормализации могут быть некоторыеимеет большое отрицательное значение. Из-за ограниченной точностибудут иметь значения, близкие к нулю, т.е.недолив(недолив). Эти значения могут быть округлены до нуля, что делаетноль и сделатьзначение-inf
. После нескольких шагов обратного распространения мы можем столкнуться с ужасным экраном.nan
результат.
Хотя мы вычисляем экспоненциальные функции, в конечном итоге мы логарифмируем их при вычислении кросс-энтропийной потери. Комбинируя softmax и кросс-энтропию вместе, мы можем избежать проблем с численной стабильностью, которые могут беспокоить нас во время обратного распространения ошибки. Как показано в приведенном ниже уравнении, мы избегаем вычисления, но может напрямую использовать. так какбыл смещен.