Open 1660079729 opened 1 year ago
您好,VCRNet/IQAnetwork.py文件下369~371行实现了视觉质量恢复网络的结构初始化和参数加载,其中371行self.VCR.eval()将模型转化为评估模式,其参数不再参与梯度计算与更新。
您好,关于pytorch的eval()函数,我查询资料发现并没有冻结训练参数的作用,主要是针对在训练时和评价时不同的 Batch Normalization 和 Dropout 方法模式。我进行了测试,发现并不会冻结参数。
import torch
import torchvision
import torch.nn as nn
import torch.optim as optim
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.layer1 = nn.Linear(3,2)
self.layer2 = nn.Linear(2,1)
def forward(self,x):
x = self.layer1(x)
x = self.layer2(x)
return x
class Net2(nn.Module):
def __init__(self):
super(Net2, self).__init__()
self.net = Net()
self.net.eval() #类似论文代码中的预训练网络设置为评估模式
self.layer = nn.Linear(1,1)
def forward(self,x):
x = self.net(x)
x = self.layer(x)
return x
x = torch.randn(5,3)
y = torch.ones(5,1)
net = Net2()
for param_tensor in net.state_dict():
print(param_tensor, '\t', net.state_dict()[param_tensor]) #打印参数
criterion = nn.L1Loss()
optimizer = optim.SGD(net.parameters(), lr=0.1, momentum=0.9)
optimizer.zero_grad()
res = net(x)
loss = criterion(y,res)
loss.backward()
optimizer.step()
print("----------------------------------------------")
for param_tensor in net.state_dict():
print(param_tensor, '\t', net.state_dict()[param_tensor]) #打印梯度更新后的参数
结果发现参数发生了更新
net.layer1.weight tensor([[-0.2807, 0.0184, -0.1791],
[ 0.5125, 0.0011, 0.3778]])
net.layer1.bias tensor([-0.0819, -0.4579])
net.layer2.weight tensor([[-0.3188, -0.5301]])
net.layer2.bias tensor([-0.5385])
layer.weight tensor([[0.6547]])
layer.bias tensor([-0.1636])
----------------------------------------------
net.layer1.weight tensor([[-0.2946, 0.0352, -0.1920],
[ 0.4894, 0.0291, 0.3563]])
net.layer1.bias tensor([-0.1028, -0.4926])
net.layer2.weight tensor([[-0.3446, -0.5224]])
net.layer2.bias tensor([-0.4731])
layer.weight tensor([[0.6072]])
layer.bias tensor([-0.0636])```
ps:我是pytorch小白一个,不知道这样对不对,请赐教,如有叨扰,请见谅
您好,论文中说到在质量预测过程中,对视觉恢复网络的权重进行了冻结,但是我在代码中没有看到相关操作,请问一下这个是怎么回事?