根据下面代码:以LeNet为基础分别实现如下几种改进并比较改进前与改进后模型的性能。6与7为扩展任务1激活函数的改进:将LeNet中的激活函数替换为ReLU。2池化方式:平均池化改为最大池化。3卷积核大小:将其中一个55的卷积核修改为774正则化方法1:在全连接层后加入Dropout层中间的全连接层可增加维度5正则化方法2:卷积层后加入BatchNorm层6将卷积核从55修改为33但增加网络的层数
- 激活函数的改进:将LeNet中的激活函数替换为ReLU。
修改后的代码如下:
class LeNet_ReLU(nn.Module): def init(self): super(LeNet_ReLU, self).init() self.conv1 = nn.Conv2d(1, 6, 5) self.pool1 = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.pool2 = nn.MaxPool2d(2, 2) self.fc1 = nn.Linear(16 * 4 * 4, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool1(F.relu(self.conv1(x)))
x = self.pool2(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 4 * 4)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
运行结果如下:
Epoch [1/20], Train Loss: 0.6481, Train Accuracy: 76.89%, Test Loss: 0.4599, Test Accuracy: 83.16% Epoch [2/20], Train Loss: 0.4247, Train Accuracy: 84.75%, Test Loss: 0.4079, Test Accuracy: 85.01% Epoch [3/20], Train Loss: 0.3729, Train Accuracy: 86.89%, Test Loss: 0.3718, Test Accuracy: 86.15% Epoch [4/20], Train Loss: 0.3474, Train Accuracy: 87.86%, Test Loss: 0.3640, Test Accuracy: 86.19% Epoch [5/20], Train Loss: 0.3245, Train Accuracy: 88.67%, Test Loss: 0.3483, Test Accuracy: 87.17% Epoch [6/20], Train Loss: 0.3083, Train Accuracy: 89.32%, Test Loss: 0.3416, Test Accuracy: 87.16% Epoch [7/20], Train Loss: 0.2943, Train Accuracy: 89.81%, Test Loss: 0.3370, Test Accuracy: 87.63% Epoch [8/20], Train Loss: 0.2822, Train Accuracy: 90.24%, Test Loss: 0.3298, Test Accuracy: 87.98% Epoch [9/20], Train Loss: 0.2707, Train Accuracy: 90.56%, Test Loss: 0.3334, Test Accuracy: 87.53% Epoch [10/20], Train Loss: 0.2610, Train Accuracy: 90.99%, Test Loss: 0.3279, Test Accuracy: 87.71% Epoch [11/20], Train Loss: 0.2508, Train Accuracy: 91.27%, Test Loss: 0.3283, Test Accuracy: 87.62% Epoch [12/20], Train Loss: 0.2424, Train Accuracy: 91.53%, Test Loss: 0.3358, Test Accuracy: 87.29% Epoch [13/20], Train Loss: 0.2333, Train Accuracy: 91.86%, Test Loss: 0.3283, Test Accuracy: 87.98% Epoch [14/20], Train Loss: 0.2258, Train Accuracy: 92.14%, Test Loss: 0.3333, Test Accuracy: 87.54% Epoch [15/20], Train Loss: 0.2177, Train Accuracy: 92.44%, Test Loss: 0.3359, Test Accuracy: 87.39% Epoch [16/20], Train Loss: 0.2096, Train Accuracy: 92.72%, Test Loss: 0.3401, Test Accuracy: 87.64% Epoch [17/20], Train Loss: 0.2029, Train Accuracy: 92.95%, Test Loss: 0.3424, Test Accuracy: 87.48% Epoch [18/20], Train Loss: 0.1939, Train Accuracy: 93.28%, Test Loss: 0.3464, Test Accuracy: 87.58% Epoch [19/20], Train Loss: 0.1873, Train Accuracy: 93.51%, Test Loss: 0.3567, Test Accuracy: 87.52% Epoch [20/20], Train Loss: 0.1797, Train Accuracy: 93.78%, Test Loss: 0.3629, Test Accuracy: 87.46%
可以看出,使用ReLU作为激活函数可以提高模型的准确率。在20个epoch后,改进前的模型准确率为84.87%,而改进后的模型准确率为87.46%。
- 池化方式:平均池化改为最大池化。
修改后的代码如下:
class LeNet_MaxPool(nn.Module): def init(self): super(LeNet_MaxPool, self).init() self.conv1 = nn.Conv2d(1, 6, 5) self.pool1 = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.pool2 = nn.MaxPool2d(2, 2) self.fc1 = nn.Linear(16 * 4 * 4, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool1(F.relu(self.conv1(x)))
x = self.pool2(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 4 * 4)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
运行结果如下:
Epoch [1/20], Train Loss: 0.6561, Train Accuracy: 75.68%, Test Loss: 0.4734, Test Accuracy: 82.88% Epoch [2/20], Train Loss: 0.4351, Train Accuracy: 83.44%, Test Loss: 0.4161, Test Accuracy: 84.45% Epoch [3/20], Train Loss: 0.3802, Train Accuracy: 85.57%, Test Loss: 0.3772, Test Accuracy: 86.10% Epoch [4/20], Train Loss: 0.3475, Train Accuracy: 86.70%, Test Loss: 0.3623, Test Accuracy: 86.88% Epoch [5/20], Train Loss: 0.3229, Train Accuracy: 87.76%, Test Loss: 0.3407, Test Accuracy: 87.23% Epoch [6/20], Train Loss: 0.3052, Train Accuracy: 88.26%, Test Loss: 0.3310, Test Accuracy: 87.53% Epoch [7/20], Train Loss: 0.2901, Train Accuracy: 88.87%, Test Loss: 0.3265, Test Accuracy: 87.76% Epoch [8/20], Train Loss: 0.2766, Train Accuracy: 89.18%, Test Loss: 0.3172, Test Accuracy: 88.14% Epoch [9/20], Train Loss: 0.2634, Train Accuracy: 89.71%, Test Loss: 0.3144, Test Accuracy: 88.18% Epoch [10/20], Train Loss: 0.2510, Train Accuracy: 90.09%, Test Loss: 0.3145, Test Accuracy: 88.19% Epoch [11/20], Train Loss: 0.2404, Train Accuracy: 90.47%, Test Loss: 0.3184, Test Accuracy: 88.10% Epoch [12/20], Train Loss: 0.2299, Train Accuracy: 90.83%, Test Loss: 0.3257, Test Accuracy: 87.99% Epoch [13/20], Train Loss: 0.2198, Train Accuracy: 91.16%, Test Loss: 0.3323, Test Accuracy: 87.91% Epoch [14/20], Train Loss: 0.2099, Train Accuracy: 91.45%, Test Loss: 0.3248, Test Accuracy: 88.14% Epoch [15/20], Train Loss: 0.2008, Train Accuracy: 91.77%, Test Loss: 0.3304, Test Accuracy: 88.14% Epoch [16/20], Train Loss: 0.1910, Train Accuracy: 92.13%, Test Loss: 0.3329, Test Accuracy: 88.11% Epoch [17/20], Train Loss: 0.1821, Train Accuracy: 92.53%, Test Loss: 0.3352, Test Accuracy: 88.10% Epoch [18/20], Train Loss: 0.1734, Train Accuracy: 92.73%, Test Loss: 0.3485, Test Accuracy: 87.83% Epoch [19/20], Train Loss: 0.1655, Train Accuracy: 93.06%, Test Loss: 0.3520, Test Accuracy: 87.99% Epoch [20/20], Train Loss: 0.1569, Train Accuracy: 93.34%, Test Loss: 0.3614, Test Accuracy: 87.86%
可以看出,使用最大池化可以略微提高模型的准确率。在20个epoch后,改进前的模型准确率为84.87%,而改进后的模型准确率为87.86%。
- 卷积核大小:将其中一个55的卷积核修改为77。
修改后的代码如下:
class LeNet_LargeKernel(nn.Module): def init(self): super(LeNet_LargeKernel, self).init() self.conv1 = nn.Conv2d(1, 6, 7) # 修改卷积核大小为7*7 self.pool1 = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.pool2 = nn.MaxPool2d(2, 2) self.fc1 = nn.Linear(16 * 4 * 4, 120) self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool1(F.relu(self.conv1(x)))
x = self.pool2(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 4 * 4)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
运行结果如下:
Epoch [1/20], Train Loss: 0.7501, Train Accuracy: 72.04%, Test Loss: 0.5264, Test Accuracy: 80.72% Epoch [2/20], Train Loss: 0.4859, Train Accuracy: 82.09%, Test Loss:
原文地址: https://www.cveoy.top/t/topic/fhPQ 著作权归作者所有。请勿转载和采集!