MINIST数据集测试不同参数对网络的影响

一.介绍

本实验使用两个不同的神经网络,通过MINIST数据集进行训练,查看不同情况下最后的效果。

1.实验环境

  1. Python 3.8
  2. Pytorch 1.8
  3. Pycharm

2.网络结构

单层卷积:一层卷积+一层池化+两层全连接

class Net_1(nn.Module):
    def __init__(self):
        super(Net_1, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(1,10,kernel_size=3,stride=1),
            #nn.BatchNorm2d(10),
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2,stride=2),
            nn.Flatten(),
            nn.Linear(10*13*13, 120),
            nn.ReLU(),
            #nn.Dropout(p=0.5),
            nn.Linear(120, 10),
        )


    def forward(self,x):
        return self.model(x)

多层网络:三层卷积+三层池化+两层全连接

class Net_2(nn.Module):
    def __init__(self):
        super(Net_2, self).__init__()
        self.model = nn.Sequential(
            # out-> [40,28,28]
            nn.Conv2d(1, 40, kernel_size=3, stride=1,padding=1),
            #nn.BatchNorm2d(40),
            nn.ReLU(),
            # out->[40,14,14]
            nn.MaxPool2d(kernel_size=2, stride=2),
            # out->[20,12,12]
            nn.Conv2d(40, 20, kernel_size=3, stride=1),
            #nn.BatchNorm2d(20),
            nn.ReLU(),
            # out->[20,6,6]
            nn.MaxPool2d(kernel_size=2, stride=2),
            # out->[20,4,4]
            nn.Conv2d(20, 20, kernel_size=3, stride=1),
            #nn.BatchNorm2d(20),
            nn.ReLU(),
            # out->[20,2,2]
            nn.MaxPool2d(kernel_size=2, stride=2),
            nn.Flatten(),
            nn.Linear(2 * 2 * 20, 100),
            nn.ReLU(),
            #nn.Dropout(p=0.5),
            nn.Linear(100, 10),
        )

    def forward(self, x):
        return self.model(x)

二.网络效果

1.初始状态

Batchsize :200
Learning_rate:0.001
Epochs:15
优化器:torch.optim.SGD
损失函数:nn.CrossEntropyLoss()
激活函数:Relu
以下变更均建立在此基础之上
单层网络效果:
在这里插入图片描述

多层网络效果:
在这里插入图片描述

最后一次的结果:

train_losstest_lossaccuracy
单层网络0.1360.1280.9634
多层网络0.0900.0800.9734

2.有BN层

单层网络效果:
在这里插入图片描述

多层网络效果:
在这里插入图片描述

最后一次的结果:

train_losstest_lossaccuracy
单层网络0.0700.0690.9784
多层网络0.0400.0480.9839

添加BN层结果有所好转

3.激活函数

tanh

单层网络效果:
在这里插入图片描述

多层网络效果:
在这里插入图片描述

最后一次的结果:

train_losstest_lossaccuracy
单层网络0.2100.2020.9417
多层网络0.1350.1220.9675

单层多层的表现都不如relu,比较接近

sigmoid

单层网络效果:
在这里插入图片描述

多层网络效果:
在这里插入图片描述

最后一次的结果:

train_losstest_lossaccuracy
单层网络0.7400.6930.8436
多层网络2.3012.3010.1135

relu

单层网络效果:
在这里插入图片描述

多层网络效果:
在这里插入图片描述

最后一次的结果:

train_losstest_lossaccuracy
单层网络0.1360.1280.9634
多层网络0.0900.0800.9734

4. 正则化

L2正则化

optimizer=optim.SGD(model.parameters(),lr=learning_rate,momentum=0.9,weight_decay=0.001)
weight_decay设置为0.001
单层网络效果:
在这里插入图片描述

多层网络效果:
在这里插入图片描述

最后一次的结果:

train_losstest_lossaccuracy
单层网络0.1290.1200.9646
多层网络0.0960.0810.974

Dropout

nn.Dropout(p=0.5)
单层网络效果:
在这里插入图片描述

多层网络效果:
在这里插入图片描述

最后一次的结果:

train_losstest_lossaccuracy
单层网络0.2010.1280.9617
多层网络0.1620.0860.9718

5.优化器

将SGD优化器变更为Adam优化器
单层网络效果:
在这里插入图片描述
多层网络效果:

在这里插入图片描述
最后一次的结果:

train_losstest_lossaccuracy
单层网络0.0070.0530.9836
多层网络0.0200.0340.9889

6. 学习率衰减

scheduler_step = torch.optim.lr_scheduler.StepLR(optimizer, step_size=5, gamma=0.2)此处使用Adam优化器,weight_decay为0.001,添加BN层,Dropout层,使用Relu函数
单层网络效果:

在这里插入图片描述
多层网络效果:
在这里插入图片描述
最后一次的结果:

train_losstest_lossaccuracy
单层网络0.0580.0430.9853
多层网络0.0240.0220.9929

三.最优测试

Batchsize :200
Learning_rate:0.01
Epochs:15
优化器:torch.optim.Adam,weight_decay为0.001
学习率衰减:step_size=2, gamma=0.2
损失函数:nn.CrossEntropyLoss()
激活函数:Relu
添加BN,dropout层
多层网络效果:
在这里插入图片描述

train_losstest_lossaccuracy
多层网络0.0310.0210.9925

附: 完整代码

import matplotlib.pyplot as plt
import torch
from torchvision import datasets
from torchvision import transforms
from torch.utils.data import DataLoader
from torch import nn, optim


def main():
    batch_size = 200
    learning_rate = 0.01
    epochs = 50

    train_loader = DataLoader(
        datasets.MNIST('MNIST', train=True, download=True, transform=transforms.Compose([
            transforms.ToTensor(),
            transforms.Normalize(0.5, 0.5)
        ])),
        batch_size=batch_size,
        shuffle=True
    )
    test_loader = DataLoader(
        datasets.MNIST('MNIST', train=False, download=True, transform=transforms.Compose([
            transforms.ToTensor(),
            transforms.Normalize(0.5, 0.5)
        ])),
        batch_size=batch_size,
        shuffle=True
    )
    device = torch.device('cuda')
    model = Net_2().to(device)
    criteon = nn.CrossEntropyLoss().to(device)
    optimizer = optim.Adam(model.parameters(), lr=learning_rate, weight_decay=0.001)
    scheduler_step = torch.optim.lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.2)
    train_loss = []
    test_loss = []
    acc = []
    for epoch in range(epochs):
        loss_1 = 0.
        loss_2 = 0.
        model.train()
        for i, (x, label) in enumerate(train_loader):
            x, label = x.to(device), label.to(device)
            out = model(x)
            loss = criteon(out, label)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            loss_1 += loss.item()
        scheduler_step.step()
        loss_1 = loss_1 / (i + 1)
        train_loss.append(loss_1)
        print('train: 第{}次,loss为{}'.format(epoch, loss_1))

        model.eval()
        with torch.no_grad():
            correct = 0.
            for i, (x, label) in enumerate(test_loader):
                x, label = x.to(device), label.to(device)
                out = model(x)
                loss = criteon(out, label)
                pred = out.argmax(dim=1)
                correct += torch.eq(pred, label).sum().item()
                loss_2 += loss.item()
            accuracy = correct / len(test_loader.dataset)
            loss_2 = loss_2 / (i + 1)
            test_loss.append(loss_2)
            acc.append(accuracy)
            print('test: 第{}次,loss为{},accuracy为{}'.format(epoch, loss_2, accuracy))

    plt.figure(num=1, figsize=(10, 5.4))

    plt.subplot(121)
    # plt.title("loss")
    plt.plot(train_loss, 'b-', label='train_loss')
    plt.plot(test_loss, 'g-', label='test_loss')
    plt.xlabel('epoch')
    plt.ylabel('loss')
    plt.legend()

    plt.subplot(122)
    plt.plot(acc, 'g-', label='accuracy')
    plt.xlabel('epoch')
    plt.ylabel('accuracy')
    plt.legend()
    plt.show()


if __name__ == '__main__':
    main()
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值