问题描述
我正在使用一层从图像中提取特征。旧层是
self.conv = nn.Conv2d(3,64,kernel_size=3,stride=2,padding=1,bias=False)
新层是
resConv = models.resnet50(pretrained=True)
resConv.conv1 = nn.Conv2d(3,bias=False)
self.conv = resConv.conv1
任何性能差异?或两个图层都相同。
解决方法
但是,几乎有一些区别。根据论文https://arxiv.org/abs/1512.03385,resnet50的conv1层(如您在torchvision.models.resnet50()
中所见)具有
conv1 = {Conv2d} Conv2d(3,64,kernel_size=(7,7),stride=(2,2),padding=(3,3),bias=False)
。
所以差异是
a)kernel_size是7x7而不是3x3
b)3x3的填充不是1x1,并且
c)将对来自resnet50.conv1的权重进行调整训练中,并且未初始化为nn.Conv2d(3,kernel_size=3,stride=2,padding=1,bias=False)
这里的主要区别在于self.Conv中的权重是默认值(例如零)并且需要训练,但是在使用预训练模型的resConv.Conv1中,权重是经过调整的,因为它是使用大型数据集训练的以前。
性能结果取决于您的任务,但总的来说,它有助于获得更好的结果(更好的局部最优)或需要更少的训练时间。