Практическое руководство по глубокому обучению 5.1 Слои и блоки PyTorch

PyTorch

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


пиши на фронт

Хоть эта статья и называется туториалом по PyTorch, она должна быть непонятна для нулевых (даже если я напишу подробное объяснение для каждой строчки кода). Я чувствую, что все еще читаю первые несколько глав «Практического глубокого обучения», когда у меня нет фундамента. Мне все равно, понимаю я это или нет, я знаю, как сначала написать, а потом вернуться к этому руководство. Просто читайте книгу по порядку.

Так же, как когда мы впервые изучали C++.

#include<iostream>
using namespace std;
int main()
{
    cout<<"hello world";
    return 0;
}

нам просто нужно знать#include<>Это заголовочный файл, и вам не нужно знать, о чем конкретно он сейчас просит. Не нужно знать, чтоusing namespace, и не нужно знать, что такое функция и что такое возвращаемое значение. нам просто нужно знатьcoutявляется выводом, и вы можете вывести его, добавив строковый тип в кавычки.endlэто новая строка, этого достаточно.

Это только мое мнение. Потому что как самоучка. Позвольте мне рассказать о моем пути к изучению pytorch (Конечно, потому что я мусор, хорошо, что большой парень просто игнорирует мое заявление.)

  • Посетите учебник Лонг Лянцю по pytorch, известный как лучший учебник по pytorch в истории. Но в то время я смотрел только Ву Энда, и некоторые вещи, о которых говорил Лонг Лянцюй, все еще были для меня сложными с нулевым фундаментом, поэтому я отказался от первого эпизода.

  • Я снова пошел смотреть «Мастер Лю Эр», и это было довольно хорошо, всего было 13 серий, я посмотрел 5 серий и больше не смог. Потому что он говорит о том, как наследоватьnn.ModuleДавай писать свою нейросеть, я в тумане.

  • Позже мой брат порекомендовал посмотреть официальный сайт учебника по pytorch. Ведь официальная точно самая последняя и авторитетная. Я пошел посмотреть. ВидетьnnЯ больше не мог видеть.

До сих пор все учебники по pytorch, которые я видел, в которых были только основы машинного обучения, потерпели неудачу.

Я не понимаю pytorch в это время? Нет, просто я могу написать.

Так я знаю о pytorch? Нет, я не могу ничего написать сам.

Тогда мне было нечего делать, и я начал шаг за шагом смотреть «Практическое глубокое обучение» и вдруг понял, как его использовать.

Так что не спешите смотреть какие-то туториалы и тому подобное. Ладно, это все. (немного ерунды)


текст

Для многослойного персептрона все, что делает модель, — это получает ввод и генерирует вывод. Но не все многослойные нейронные сети одинаковы, поэтому для реализации сложных нейронных сетей необходимоБлок нейронной сети, блок может описывать один слой, компонент, состоящий из нескольких слоев, или саму модель целиком. Одним из преимуществ использования блоков для абстракции является то, что некоторые блоки можно объединять в более крупные компоненты.

image.png

С точки зрения программирования блок состоит изсвоего рода(класс) представительство. Любой его подкласс должен определять функцию прямого распространения, которая преобразует входные данные в выходные данные и должна хранить все необходимые параметры. Обратите внимание, что некоторые блоки не требуют никаких параметров. Наконец, для вычисления градиентов блок должен иметь функцию обратного распространения. К счастью, при определении собственного блока из-заautogradПредставленный в ) предоставляет несколько внутренних реализаций, нам просто нужно рассмотреть функцию прямого распространения и необходимые параметры.

В этой части мы будем настраивать наши собственные слои и блоки..

Сначала реализуйте простой многослойный персептрон:

import torch
from torch import nn
from torch.nn import functional as F

net = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))

X = torch.rand(2, 20)
net(X)

Оригинальный текст можно найти здесь:Практическое глубокое обучение 4.3 Простая реализация многослойных персептронов

Этот многослойный персептрон состоит из полностью связанного скрытого слоя с 256 единицами и функцией активации ReLU, за которым следует полностью связанный выходной слой с 10 скрытыми единицами и без функции активации.

путем создания экземпляраnn.SequentialЧтобы построить нашу модель, порядок, в котором выполняются слои, соответствует порядку, в котором передаются параметры.

  • nn.Sequentialопределяет особыйModule, класс, представляющий блок в PyTorch. Он поддерживаетModuleУпорядоченный список, состоящий из (LinearклассModuleподкласс).

  • прямое распространение (forward) функция: объединяет каждый блок в списке вместе, принимая выходные данные каждого блока в качестве входных данных следующего блока.

  • пройти черезnet(X)Вызовите нашу модель, чтобы получить выходные данные модели. даnet.__call__(X)сокращение для .(Независимо от того, что у него есть для этого предложения, продолжайте читать дальше.)

Мы также можем сами написать многослойный персептрон.:

class MLP(nn.Module):
    def __init__(self):
        # 调用`MLP`的父类的构造函数来执行必要的初始化。
        # 这样,在类实例化时也可以指定其他函数参数,例如模型参数`params`(稍后将介绍)
        super().__init__()
        
        self.hidden = nn.Linear(20, 256)  # 隐藏层
        self.out = nn.Linear(256, 10)  # 输出层

    # 定义模型的正向传播,即如何根据输入`X`返回所需的模型输出
    def forward(self, X):
        # 注意,这里我们使用ReLU的函数版本,其在nn.functional模块中定义。
        return self.out(F.relu(self.hidden(X)))

net = MLP()
net(X)
  • пройти черезsuper().__init__()вызвать родительский класс__init__функции, избавляя вас от необходимости переписывать код шаблона, который работает для большинства блоков.

  • Создайте два полносвязных слоя соответственноself.hiddenиself.out.

    • Если мы не реализуем новый оператор, нам не нужно беспокоиться о функции обратного распространения или инициализации параметров, система сгенерирует их автоматически.

    • Позвони раньшеnet()эквивалентно вызовуnet.__call__(X), потому что мы писали вперед в нашем MLP, но не вызывали его, просто использовалиnet()Он автоматически выполняет вперед. Это потому, что он автоматически вызовет.__call__Функция заставляет выполняться вперед.

После произнесения вторых двух, первое:

image.png

Как достигается упорядочивание, построение упрощенногоMySequential:

class MySequential(nn.Module):
    def __init__(self, *args):
        super().__init__()
        for block in args:
            # 这里,`block`是`Module`子类的一个实例。我们把它保存在'Module'类的成员变量
            # `_modules` 中。`block`的类型是OrderedDict。
            self._modules[block] = block

    def forward(self, X):
        # OrderedDict保证了按照成员添加的顺序遍历它们
        for block in self._modules.values():
            X = block(X)
        return X

MySequentialкласс предоставляется по умолчаниюSequentialкласс с той же функциональностью.

net = MySequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))
net(X)

использоватьMySequentialкласс реализует многослойный персептрон иSequentialКласс реализует то же самое.

обратите внимание здесьТолькоНапишите его порядок выполнения, который является упрощенной версиейSequentialсвоего рода!


  1. Подробнее о серии «Практическое глубокое обучение» см. здесь:Колонка «Практическое глубокое обучение» (juejin.cn)

  2. Примечания Адрес Github:DeepLearningNotes/d2l(github.com)

Все еще в процессе обновления......