NUIST-Videocoding / VCRNet

Code for VCRNet: Visual Compensation Restoration Network for No-Reference Image Quality Assessment
21 stars 6 forks source link

关于模型的问题 #2

Open 1660079729 opened 1 year ago

1660079729 commented 1 year ago

您好,论文中说到在质量预测过程中,对视觉恢复网络的权重进行了冻结,但是我在代码中没有看到相关操作,请问一下这个是怎么回事?

NUIST-Videocoding commented 1 year ago

您好,VCRNet/IQAnetwork.py文件下369~371行实现了视觉质量恢复网络的结构初始化和参数加载,其中371行self.VCR.eval()将模型转化为评估模式,其参数不再参与梯度计算与更新。

1660079729 commented 1 year ago

您好,关于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小白一个,不知道这样对不对,请赐教,如有叨扰,请见谅