Nano Hash - криптовалюты, майнинг, программирование

pytorch как установить .requires_grad ложь

Я хочу, чтобы некоторые из моих моделей были заморожены. Следуя официальным документам:

with torch.no_grad():
    linear = nn.Linear(1, 1)
    linear.eval()
    print(linear.weight.requires_grad)

Но он печатает True вместо False. Если я хочу установить модель в режим оценки, что мне делать?


  • В документации есть простой пример прекрасного -тюнинг, который должен вам помочь. 08.08.2018

Ответы:


1

requires_grad = Ложь

Если вы хотите заморозить часть вашей модели и обучить остальную, вы можете установить requires_grad из параметров, которые вы хотите заморозить, на False.

Например, если вы хотите сохранить фиксированной только сверточную часть VGG16:

model = torchvision.models.vgg16(pretrained=True)
for param in model.features.parameters():
    param.requires_grad = False

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

torch.no_grad ()

Использование диспетчера контекста torch.no_grad - это другой способ достижения этой цели: в контексте no_grad все результаты вычислений будут иметь requires_grad=False, даже если входные данные имеют requires_grad=True. Обратите внимание, что вы не сможете распространять градиент на слои до no_grad. Например:

x = torch.randn(2, 2)
x.requires_grad = True

lin0 = nn.Linear(2, 2)
lin1 = nn.Linear(2, 2)
lin2 = nn.Linear(2, 2)
x1 = lin0(x)
with torch.no_grad():    
    x2 = lin1(x1)
x3 = lin2(x2)
x3.sum().backward()
print(lin0.weight.grad, lin1.weight.grad, lin2.weight.grad)

выходы:

(None, None, tensor([[-1.4481, -1.1789],
         [-1.4481, -1.1789]]))

Здесь lin1.weight.requires_grad было True, но градиент не был вычислен, потому что операция была выполнена в контексте no_grad.

model.eval ()

Если ваша цель не в точной настройке, а в том, чтобы установить модель в режим вывода, наиболее удобный способ - использовать torch.no_grad диспетчер контекста. В этом случае вам также необходимо установить модель в режим оценки, это достигается путем вызова eval() на nn.Module, например:

model = torchvision.models.vgg16(pretrained=True)
model.eval()

Эта операция устанавливает для атрибута self.training слоев значение False, на практике это изменит поведение таких операций, как Dropout или BatchNorm, которые должны вести себя по-разному во время обучения и тестирования.

08.08.2018
  • Спасибо за ваше объяснение. Есть ли разница в эффективности между torch.no_grad() диспетчером контекста и t.requires_grad=False, особенно когда речь идет об эффективности памяти? Как вы упомянули ранее, t.requires_grad=False, никакие промежуточные буферы не будут сохраняться, будет ли это более эффективным? 09.08.2018
  • Они эквивалентны 09.08.2018

  • 2

    Вот способ;

    linear = nn.Linear(1,1)
    
    for param in linear.parameters():
        param.requires_grad = False
    
    with torch.no_grad():
        linear.eval()
        print(linear.weight.requires_grad)
    

    ВЫХОД: Ложь

    08.08.2018

    3

    Чтобы заполнить ответ @ Salih_Karagoz, у вас также есть контекст torch.set_grad_enabled() (дополнительная документация здесь), которую можно использовать чтобы легко переключаться между режимами обучения / оценки:

    linear = nn.Linear(1,1)
    
    is_train = False
    
    for param in linear.parameters():
        param.requires_grad = is_train
    with torch.set_grad_enabled(is_train):
        linear.eval()
        print(linear.weight.requires_grad)
    
    08.08.2018
  • Это ложь. 07.12.2020
  • Спасибо @Tengerye, ответ обновлен. 08.12.2020

  • 4

    Это руководство может помочь.

    Короче говоря, я думаю, что хороший ответ на этот вопрос может быть следующим:

    linear = nn.Linear(1,1)
    
    for param in linear.parameters():
        param.requires_grad = False
    
    linear.eval()
    print(linear.weight.requires_grad)
    
    
    28.03.2019
  • Чем это отличается от старых ответов / расширяется? 29.03.2019
  • @dedObed Я суммировал в учебнике несколько различных вариантов использования, чтобы дать точный ответ на этот вопрос. Принятый ответ очень хорош. Я включил .detach (), который имеет непосредственное отношение к этому вопросу в учебнике. 30.03.2019

  • 5

    Отлично. Хитрость заключается в том, чтобы проверить, что когда вы определяете Linear Layar, параметры по умолчанию будут иметь requires_grad=True, потому что мы хотели бы изучить, верно?

    l = nn.Linear(1, 1)
    p = l.parameters()
    for _ in p:
        print (_)
    
    # Parameter containing:
    # tensor([[-0.3258]], requires_grad=True)
    # Parameter containing:
    # tensor([0.6040], requires_grad=True)    
    

    Другая конструкция,

    with torch.no_grad():
    

    Значит, здесь нельзя учиться.

    Итак, ваш код просто показывает, что вы способны учиться, даже если вы находитесь в torch.no_grad(), где обучение запрещено.

    with torch.no_grad():
        linear = nn.Linear(1, 1)
        linear.eval()
        print(linear.weight.requires_grad) #true
    

    Если вы действительно планируете отключить requires_grad для параметра веса, вы также можете сделать это с помощью:

    linear.weight.requires_grad_(False)
    

    or

    linear.weight.requires_grad = False
    

    Итак, ваш код может стать таким:

    with torch.no_grad():
        linear = nn.Linear(1, 1)
        linear.weight.requires_grad_(False)
        linear.eval()
        print(linear.weight.requires_grad)
    

    Если вы планируете переключиться на requires_grad для всех параметров в модуле:

    l = nn.Linear(1, 1)
    for _ in l.parameters():
        _.requires_grad_(False)
        print(_)
    
    26.06.2019
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..