skip to content
Liu Yang's Blog

通过nn.Parameter实现自适应参数学习的并行CNN

/ 2 min read

Table of Contents

实现一个CNN

class CNN(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(
in_channels=1, out_channels=64, kernel_size=3, stride=1, padding=1
)
self.relu1 = nn.ReLU()
self.conv2 = nn.Conv2d(
in_channels=64, out_channels=3, kernel_size=3, stride=1, padding=1
)
self.relu2 = nn.ReLU()
self.mlp = nn.Sequential(
nn.Flatten(),
nn.Linear(3 * 28 * 28, 512),
nn.ReLU(),
nn.Linear(512, 10),
)
def forward(self, x):
x = self.relu1(self.conv1(x))
x = self.relu2(self.conv2(x))
return self.mlp(x)

实现一个自适应参数学习的并行CNN

# 定义模型
class MultiCNN(nn.Module):
def __init__(self):
super().__init__()
self.cnn1 = CNN()
self.cnn2 = CNN()
self.weight = nn.Parameter(torch.randn(2))
def forward(self, x):
x1 = self.cnn1(x)
x2 = self.cnn2(x)
y = x1 * self.weight[0] + x2 * self.weight[1]
return y
# 其他超参数
epochs = 10
batch_size = 64
learning_rate = 1e-3
model = MultiCNN().to(device)
train_loader = DataLoader(train_data, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_data, batch_size=batch_size, shuffle=True)
loss_fn = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)

实验结果

实现MultiCNN,通过nn.Parameter(torch.randn(2))定义并且初始化一个可学习的参数,为两个并行的CNN输出做一个求和,最终训练结果为Accuracy: 99.883%。单一模型的结果约为99.7%

实验分析

最终可训练的参数值为[-0.5475, 1.0037],是否可以理解为一个学习正向表征,一个学习f,通过求和来让分类趋势更加明显?