pytorch冻结网络参数,requires_grad与optimizer顺序的关系
作者:佚名 发布时间:2024-05-06 05:06:48点击:
在 PyTorch 中冻结某些层参数不训练可以通过以下步骤实现:
1. 加载 ResNet50 预训练模型:
```python
import torchvision.models as models
resnet50=models.resnet50(pretrained=True)
```
2. 冻结指定层的参数:
```python
for name, param in resnet50.named_parameters():
if 'layer3' not in name and 'layer4' not in name:
param.requires_grad=False
```
上述代码中,我们遍历 ResNet50 模型的所有参数,如果参数名中不包含 "layer3" 和 "layer4",则将其 requires_grad 属性设置为 False,即冻结该层的参数。
3. 将模型放到 GPU 上:
```python
device=torch.device('cuda' if torch.cuda.is_available() else 'cpu')
resnet50=resnet50.to(device)
```
4. 定义优化器和损失函数:
```python
import torch.optim as optim
criterion=nn.CrossEntropyLoss()
optimizer=optim.SGD(filter(lambda p: p.requires_grad, resnet50.parameters()), lr=0.001, momentum=0.9)
```
上述代码中,我们只优化 requires_grad 属性为 True 的参数,即未冻结的参数。
5. 训练模型:
```python
for epoch in range(num_epochs):
for i, (inputs, labels) in enumerate(train_loader):
inputs=inputs.to(device)
labels=labels.to(device)
optimizer.zero_grad()
outputs=resnet50(inputs)
loss=criterion(outputs, labels)
loss.backward()
optimizer.step()
```
上述代码中,我们使用 DataLoader 加载数据,并将输入和标签放到 GPU 上进行训练。由于部分参数被冻结,因此反向传播时只会更新未冻结的参数。