第三次作业代码练习

一、代码练习

1. lab 1
1.1 模型代码
class FC2Layer(nn.Module):
    def __init__(self, input_size, n_hidden, output_size):
        # nn.Module子类的函数必须在构造函数中执行父类的构造函数
        # 下式等价于nn.Module.__init__(self)        
        super(FC2Layer, self).__init__()
        self.input_size = input_size
        # 这里直接用 Sequential 就定义了网络,注意要和下面 CNN 的代码区分开
        self.network = nn.Sequential(
            nn.Linear(input_size, n_hidden), 
            nn.ReLU(), 
            nn.Linear(n_hidden, n_hidden), 
            nn.ReLU(), 
            nn.Linear(n_hidden, output_size), 
            nn.LogSoftmax(dim=1)
        )
class CNN(nn.Module):
    def __init__(self, input_size, n_feature, output_size):
        # 执行父类的构造函数,所有的网络都要这么写
        super(CNN, self).__init__()
        # 下面是网络里典型结构的一些定义,一般就是卷积和全连接
        # 池化、ReLU一类的不用在这里定义
        self.n_feature = n_feature
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=n_feature, kernel_size=5)
        self.conv2 = nn.Conv2d(n_feature, n_feature, kernel_size=5)
        self.fc1 = nn.Linear(n_feature*4*4, 50)
        self.fc2 = nn.Linear(50, 10)  
1.2截图

image-20211016153658280

image-20211016153717390

2. lab 2
2.1 模型代码
  class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x
   
2.2截图

image-20211016153840815

image-20211016154340070

3. lab 3
3.1 模型代码
class VGG(nn.Module):
    def __init__(self):
        super(VGG, self).__init__()
        self.cfg = [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M']
        self.features = self._make_layers(self.cfg)
        self.classifier = nn.Linear(512, 10)

    def forward(self, x):
        out = self.features(x)
        out = out.view(out.size(0), -1)
        out = self.classifier(out)
        return out

    def _make_layers(self, cfg):
        layers = []
        in_channels = 3
        for x in cfg:
            if x == 'M':
                layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
            else:
                layers += [nn.Conv2d(in_channels, x, kernel_size=3, padding=1),
                           nn.BatchNorm2d(x),
                           nn.ReLU(inplace=True)]
                in_channels = x
        layers += [nn.AvgPool2d(kernel_size=1, stride=1)]
        return nn.Sequential(*layers)
3.2截图

image-20211016153439343

image-20211016153455833

二、想法解读

分享Typora将本地图片上传的方法

​ 从 lab 1实验中,可以看出由于卷积神经网络的卷积核这种设置(有局部关联,参数共享的特点),使得卷积神经网络可以以比传统网络更少的参数。也因为卷积核的存在使得卷积神经网络十分适合运用到图像领域。 但是因为卷积核考虑像素点周围临近像素点的影响,所以使得其在lab 1中图像像素点随机打乱后表现出一个很差的效果,从另一个角度来说,卷积神经网络对图像本身的要求要高于传统的神经网络。从lab 2中可以看出,使用一个简单的卷积网络使用后所表现的效果不好,所以为了减少试错我们可以考虑使用经典的网络结构,或者在经典网络中调节结构。可以从lab 3 中看出,通过模仿VGG网络在相同的数据集上,取得了比一个相对随机设置的网络好得多的结果。从实验的代码中,学习到了完成网络搭建,数据集读取,网络训练,以及网络效果测验的完整的卷积网络的使用。

卷积神经网络为什么会这么有效?分析卷积神经网络背后的奥秘

posted @ 2021-10-16 15:46  亚里士多熊  阅读(27)  评论(0编辑  收藏  举报