Заморозка слоя в PyTorch
Заморозка слоя означает, что у его параметров поле записи градиента ставят в ложь. Такие веса не обновляются, хотя прямой проход через них по-прежнему работает. Заморозим первый линейный блок в двухслойной модели:
import torch
import torch.nn as nn
class PairNet(nn.Module):
def __init__(self):
super().__init__()
self.first = nn.Linear(2, 3)
self.second = nn.Linear(3, 1)
def forward(self, x):
return self.second(self.first(x))
net = PairNet()
for param in net.first.parameters():
param.requires_grad = False
x = torch.tensor([[1.0, 2.0]])
out = net(x)
print(out.shape) # выведет torch.Size([1, 1])
В переборе параметров с включённой записью градиента замороженный слой не появляется - остаются только веса второго блока:
import torch
import torch.nn as nn
class PairNet(nn.Module):
def __init__(self):
super().__init__()
self.first = nn.Linear(2, 3)
self.second = nn.Linear(3, 1)
def forward(self, x):
return self.second(self.first(x))
net = PairNet()
for param in net.first.parameters():
param.requires_grad = False
trainable = [
p for p in net.parameters() if p.requires_grad
]
print(len(trainable)) # выведет 2
Соберите модуль с линейными
слоями 2 на 4
и 4 на 1.
Отключите запись градиента
у всех весов первого блока.
Выведите число тензоров
с включённой записью
у всей сети.
Опишите сеть из двух линейных
преобразований 3 на 2
и 2 на 2.
Заморозьте второй блок
и выведите, сколько параметров
осталось с активной записью
градиента.
Создайте блок с линейным слоем
1 на 5 и вторым
5 на 1.
У первого фрагмента снимите
флаг обучения у каждого
тензора. Выведите общее число
замороженных скаляров
в первом слое.