PyTorch中同一卷积层能否同时添加自定义固定滤波器和随机初始化滤波器
PyTorch卷积层添加自定义固定滤波器实现方案
完全可以在你当前定义的conv1卷积层内加入自定义固定滤波器,不需要额外新增卷积层,具体实现方法如下:
具体操作步骤
- 首先明确PyTorch中
nn.Conv2d的权重维度规则:参数权重的维度为(输出通道数, 输入通道数, 卷积核高度, 卷积核宽度),你当前定义的conv1输入通道为1,输出通道为10,卷积核尺寸3×3,刚好匹配你给出的3×3自定义滤波器尺寸。 - 将numpy格式的自定义滤波器转为PyTorch张量,补全匹配权重的维度后,赋值给conv1权重的对应输出通道位置即可。
- 如果你需要这个滤波器固定不参与训练更新,将对应位置参数的
requires_grad属性设置为False即可。
完整代码示例
import torch import torch.nn as nn import numpy as np class Net(nn.Module): def __init__(self): super(Net, self).__init__() # 原有卷积层定义,输出10个通道,你也可以改成11来新增一个通道放自定义滤波器 self.conv1 = nn.Conv2d(1, 10, kernel_size=3) # 你的自定义固定滤波器 filter_vals = np.array([[-1, -1, 1], [-1, -1, 1], [-1, -1, 1]]) # 转换为float类型张量,补全维度适配conv1权重格式 filter_tensor = torch.from_numpy(filter_vals).float().unsqueeze(0).unsqueeze(0) # 这里是将自定义滤波器赋值给第1个输出通道的权重,你可以换成其他索引位置 self.conv1.weight.data[0] = filter_tensor # 固定该滤波器,训练时不更新参数 self.conv1.weight.data[0].requires_grad = False
补充说明
如果你不想替换原本的10个卷积核,想把自定义滤波器作为额外的独立通道使用,只需要把
nn.Conv2d的第二个参数(输出通道数)改成11,再把自定义滤波器赋值给第11个通道(索引为10)即可,剩余10个通道依然保留默认初始化和训练更新的逻辑。
如果需要添加多个自定义固定滤波器,重复上面的赋值和设置requires_grad的操作即可。
内容的提问来源于stack exchange,提问作者Itay
相关产品推荐
相关产品推荐

