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 = 10batch_size = 64learning_rate = 1e-3model = 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,通过求和来让分类趋势更加明显?