Практическое глубокое обучение 3.3 — простая реализация линейной регрессии

PyTorch

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

В начале это был еще пакет-руководство, и теперь вам не нужно писать его самостоятельно, вы можете напрямую использовать модуль nn из pytorch.

import torch
from torch.utils import data
from d2l import torch as d2l
from torch import nn

Так же, как и ручная реализация линейной регрессии, сначала сгенерируйте набор данных вручную.В предыдущем разделе уже было написано, как его сгенерировать вручную, поэтому я больше не буду писать, и эта функция была интегрирована в пакет d2l (d2l is для «Изучения глубокого обучения вручную»). 》Специальный пакет)

true_w = torch.tensor([2, -3.4])
true_b = 4.2
# synthetic_data 这个在上一节已经实现了,所以集成到d2l,不用再自己写
features, labels = d2l.synthetic_data(true_w, true_b, 1000)

Далее следует загрузить набор данных, который используетсяfrom torch.utils import data. Перемешивание такое же, как и раньше, вы хотите перетасовать порядок.

def load_array(data_arrays, batch_size, is_train=True):  #@save
    """构造一个PyTorch数据迭代器。"""
    dataset = data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset, batch_size, shuffle=is_train)

data_iter здесь также является итератором, к которому можно получить доступ с помощью next, что ничем не отличается от предыдущего раздела.

batch_size = 10
data_iter = load_array((features, labels), batch_size)

В nn определено большое количество слоев, которые эквивалентны нашим полносвязным слоям. Исходная простая линейная модель не требует использования Sequential, но для ознакомления с операцией Sequential здесь принудительно.

nn.Linear(2, 1)Укажите размеры входа и выхода.

пройти черезnet[0]Инициализируйте вес веса и параноидальный уклон.

Вам не нужно записывать потери самостоятельно, вы можете напрямую использовать встроенный MSELoss, который1n(y^y)2\frac1 n \sum{(\hat y - y)^2}Здесь мы подробно поговорим о функции MSELoss. Тип возвращаемого значения можно определить путем сокращения. сокращение может принимать три значения, по умолчанию используется среднее

  • 'none': no reduction will be applied.
  • 'mean': the sum of the output will be divided by the number of elements in the output.
  • 'sum': the output will be summed.

none означает ничего не делать и напрямую возвращать тензор.(y^y)2{(\hat y - y)^2}

Сумма, как следует из названия, заключается в суммировании тензора, возврате суммы тензора после суммирования и завершении уменьшения размерности.(y^y)2\sum{(\hat y - y)^2}

среднее тоже уменьшение размерности, по умолчанию это среднее, а среднее вычисляется после суммирования.1n(y^y)2\frac1 n \sum{(\hat y - y)^2}

Нет необходимости писать функцию оптимизации самостоятельно. питорч дает.

net = nn.Sequential(nn.Linear(2, 1))

net[0].weight.data.normal_(0, 0.01)
net[0].bias.data.fill_(0)

loss = nn.MSELoss()

trainer = torch.optim.SGD(net.parameters(), lr=0.03)

num_epochs = 3, выполнить только три градиентных спуска.

num_epochs = 3
for epoch in range(num_epochs):
    for X, y in data_iter:
        l = loss(net(X) ,y)
        trainer.zero_grad()
        l.backward()
        trainer.step()
    l = loss(net(features), labels)
    print(f'epoch {epoch + 1}, loss {l:f}')