Логистическая регрессия в наборе данных MNIST с использованием PyTorch

машинное обучение глубокое обучение Программа перевода самородков PyTorch

Логистическая регрессияЕго можно использовать не только для описания данных, но и для объяснения связи между различными бинарными переменными, категориальными переменными, порядковыми переменными, переменными расстояния и переменными отношения в данных [1]. На рисунке ниже показанологистическая регрессияиЛинейная регрессияразница.

Taken from [https://www.sciencedirect.com/topics/nursing-and-health-professions/logistic-regression-analysis](https://www.sciencedirect.com/topics/nursing-and-health-professions/logistic-regression-analysis)

В этой статье будет показано, как написать модель логистической регрессии с использованием PyTorch.

Мы попытаемся решить проблему классификации на наборе данных MNIST. Для начала импортируем все нужные нам библиотеки:

import torch
from torch.autograd import Variable
import torchvision.transforms as transforms
import torchvision.datasets as dsets

Перед созданием модели мне нравится составлять список шагов следующим образом. На официальном сайте PyTorch также есть этот список шагов [2]:

# 第一步:加载数据集
# 第二步:使数据集可迭代
# 第三步:创建模型类
# 第四步:将模型类实例化
# 第五步:实例化 Loss 类
# 第六步:实例化优化器类
# 第七步:训练模型

Ниже мы выполним вышеперечисленные шаги шаг за шагом.

Загрузить набор данных

Мы используемtorchvision.datasetsдля загрузки набора данных. Этот репозиторий содержит почти все популярные наборы данных для машинного обучения. Полный список наборов данных можно увидеть в [3].

train_dataset = dsets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=False)
test_dataset = dsets.MNIST(root='./data', train=False, transform=transforms.ToTensor())

Сделать набор данных итерируемым

Мы используем класс DataLoader, чтобы сделать наш набор данных итерируемым с помощью следующего кода:

train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)

Создайте класс модели

Теперь мы создадим класс, который определяет структуру нашей модели логистической регрессии:

class LogisticRegression(torch.nn.Module):
    def __init__(self, input_dim, output_dim):
        super(LogisticRegression, self).__init__()
        self.linear = torch.nn.Linear(input_dim, output_dim)

    def forward(self, x):
        outputs = self.linear(x)
        return outputs

создать экземпляр класса модели

Перед созданием экземпляра класса модели мы инициализируем параметры, показанные ниже:

batch_size = 100
n_iters = 3000
epochs = n_iters / (len(train_dataset) / batch_size)
input_dim = 784
output_dim = 10
lr_rate = 0.001

Затем мы можем инициализировать нашу модель логистической регрессии:

model = LogisticRegression(input_dim, output_dim)

Создайте экземпляр класса Loss

Мы используем кросс-энтропийные потери для расчета потерь:

criterion = torch.nn.CrossEntropyLoss() # 计算 softmax 分布之上的交叉熵损失

Создайте экземпляр класса оптимизатора

Оптимизатор — это алгоритм обучения, который мы собираемся использовать. В этом примере мы будем использовать стохастический градиентный спуск (SGD) в качестве оптимизатора:

optimizer = torch.optim.SGD(model.parameters(), lr=lr_rate)

Обучите модель

Это последний шаг. Мы будем использовать следующий код для обучения модели:

iter = 0
for epoch in range(int(epochs)):
    for i, (images, labels) in enumerate(train_loader):
        images = Variable(images.view(-1, 28 * 28))
        labels = Variable(labels)

        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        iter+=1
        if iter%500==0:
            # 计算准确率
            correct = 0
            total = 0
            for images, labels in test_loader:
                images = Variable(images.view(-1, 28*28))
                outputs = model(images)
                _, predicted = torch.max(outputs.data, 1)
                total+= labels.size(0)
                # 如果用的是 GPU,则要把预测值和标签都取回 CPU,才能用 Python 来计算
                correct+= (predicted == labels).sum()
            accuracy = 100 * correct/total
            print("Iteration: {}. Loss: {}. Accuracy: {}.".format(iter, loss.item(), accuracy))

Во время обучения модели требуется всего 3000 итераций, чтобы достичь82%точность. Вы можете попытаться продолжить настройку параметров и посмотреть, сможете ли вы еще немного повысить точность.

Если вы хотите углубить свое понимание реализации логистической регрессии в PyTorch, вы можете применить приведенную выше модель к любой проблеме классификации. Например, вы можете обучить модель логистической регрессии на своем любимомГерои Марвелдля классификации изображений (половина из них были выделены серым цветом, поэтому их нетрудно классифицировать) :)

Цитировать

[1] woohoo.statistics Solutions.com/what-is-log…

[2] py torch.org/tutorials/ нет…

[3] py torch.org/docs/stable…

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.