卷积神经网络(CNN)(中)

4.GoogleNet

 

GoogleNet(也可称作Inception)是在2014年由Google DeepMind公式的研究员提出的一种全新的深度学习结构,并取得了ILSVRC2014比赛项目的第一名。GooleNet共有22层,并且没用全连接层,所以使用了更少的参数,在GooleNet前的AlexNet、VGG等结构,均通过增大网络的层数来获得更好的训练结果,但更深的层数同时会带来较多的负面效果,如过拟合、梯度消失、梯度爆炸等问题。

GoogleNet则是保证算力的情况下增大网络的深度和宽度,尤其是其提出的Inception模块。

在GoogleNet中前前几层是正常的卷积层,后面则全部用Inception堆叠而成。在文章Going Deeper with Convolutions中给出了两种结构的Inception模块,分别是简单的Inception模块和维度减少的Inception模块。和简单的Inception模块相比,维度减少的Inception模块在3*3卷积的前面、5*5卷积前面和池化层后面添加1*1卷积进行降维,从而使维度变得可控并减少计算量。

在GoogleNet中不仅提出了Inception模块,还在模块中添加了两个辅助分类器,起到增加低层网络的分类能力、防止梯度消失、增加网络正则化的作用。

在torchvision库的models模块中,已经包含了与训练好的GoogleNet模型,可以直接使用下面的程序进行调用:

import torchvision.models as models
googlenet=models.googlenet()

5.TextCNN

TextCNN是一种利用卷积神经网络进行自然语言处理的网络结构。

在网络结构中,针对一个句子的词嵌入使用一层卷积层进行文本信息的提取。在卷积操作时,使用高度为2,3,4的卷积核,每个卷积核有2个,共有6个卷积核,6个卷积核对输入的句子进行卷积操作后,会得到6个向量,对此6个向量(卷积后的输出)各取一个最大值进行池化,然后将6个最大值拼接为一个列向量,该列向量即为通过一层卷积操作从句子中提取到有用信息,并将其和分类器层连接后,即可组成TextCNN的网络结构。

针对使用卷积神经网络进行图像分类问题,下面将会使用Pytorch搭建一个类似LeNet-5的网络结构,用于Fashion——MNIST数据集的图像分类。

针对该问题的分析可以分为数据准备、模型建立以及使用训练集进行训练与使用测试集测试模型的效果。针对卷积网络的建立,将会分别建立常用的卷积神经网络与机遇空洞卷积的卷积神经网络。首先导入所需要的库和相关模块:

import numpy as np
import pandas as pd
from sklearn.metrics import accuracy_score,confusion_matrix,classification_report
import matplotlib.pyplot as plt
import seaborn as sns
import copy
import time
import torch
import torch.nn as nn
from torch.optim import Adam
import torch.utils.data as Data
from torchvision import transforms
from torchvision.datasets import FashionMNIST

在模型建立与训练之前,首先准备FashionMNIST数据集,该数据集可以直接使用torchvision库中datasets模块的FashionMNIST()的API函数读取,如果指定的工作文件夹中没有当前数据,可以从网络上自动下载该数据集,数据点准备程序如下所示:

train_data=FashionMNIST(
    root="./data/FashionMNIST",
    train=True,
    transform=transforms.ToTensor(),
    download=False
)
train_loader=Data.DataLoader(
    dataset=train_data,
    batch_size=64,
    shuffle=False,
    num_workers=2,
)
print("train_loader的batch数量为:",len(train_loader))

输出结果为:

 上面的程序导入了训练数据集,然后使用Data.DataLoader()函数将其定义为数据加载器,每个batch中包含64个样本,通过len()函数可以计算书籍加载器中包含的batch数量,输出显示train_loader中包含938个batch。需要注意的是参数shuffle=False,表示加载器中每个batch使用的样本都是固定的,这样有利于在训练模型时根据迭代的次数将其切分为训练集和测试集。

为了观察数据集中每个图像的内容,可以获取一个batch的图像,然后将其可视化,以观察数据。获取数据并可视化的程序如下:

 for step,(b_x,b_y) in enumerate(train_loader):
        if step >0:
            break
    batch_x=b_x.squeeze().numpy()
    batch_y=b_y.numpy()
    class_label=train_data.classes
    class_label[0]="T-shirt"
    plt.figure(figsize=(12,5))
    for ii in np.arange(len(batch_y)):
        plt.subplot(4,16,ii+1)
        plt.imshow(batch_x[ii,:,:],cmap=plt.cm.gray)
        plt.title(class_label[batch_y[ii]],size=9)
        plt.axis("off")
        plt.subplots_adjust(wspace=0.05)
    # plt.show()

运行结果如下:

在对训练集进行处理后,虾米你对测试数据集进行处理。导入测试数据集后,将所有样本处理为一个整体,看做一个batch用于测试,可食用如下程序:

 

 test_data=FashionMNIST(
        root="./data/FashionMNIST",
        train=False,
        download=False
    )
    test_data_x=test_data.data.type(torch.FloatTensor)/255.0
    test_data_x=torch.unsqueeze(test_data_x,dim=1)
    test_data_y=test_data.targets
    # print("test_data_x.shape:",test_data_x.shape)
    # print("test_data_y.shape:",test_data_y.shape)

输出结果如下:

上面程序同样食用FashionMNIST()函数导入测试数据集,并且将其处理为一个整体,从输出结果可发现测试集有10000张28*28的图像。

在数据准备完毕后,可以搭建一个卷积神经网络,并且使用训练数据对网络进行训练,使用测试集验证所搭建的网络的识别精度。针对搭建的卷积神经网络,可以使用下面的程序代码对卷积神经网络进行定义。 

 class MyConvNet(nn.Module):
        def __init__(self):
            super(MyConvNet,self).__init__()
            self.conv1=nn.Sequential(
                nn.Conv2d(
                    in_channels=1,
                    out_channels=16,
                    kernel_size=3,
                    stride=1,
                    padding=1,

                ),
                nn.ReLU(),
                nn.AvgPool2d(
                    kernel_size=2,
                    stride=2,
                ),
            )
            self.conv2=nn.Sequential(
                nn.Conv2d(16,32,3,1,0),
                nn.ReLU(),
                nn.AvgPool2d(2,2)
            )
            self.classifier=nn.Sequential(
                nn.Linear(32*6*6,256),
                nn.ReLU(),
                nn.Linear(256,128),
                nn.ReLU(),
                nn.Linear(128,10)
            )
        def forward(self,x):
            x=self.conv1(x)
            x=self.conv2(x)
            x=x.view(x.size(0),-1)
            output=self.classifier(x)
            return output
    myconvnet=MyConvNet()
    # print(myconvnet)

输出结果如下:

上面程序中的类MyConvNet()通过nn.Sequential()、nn.Conv2d()、nn.ReLU()、等层,定义了一个拥有两个卷积层和三个全联机层的卷积神经网络分类器,并且在forward()函数中定义了数据在网络中的前向传播过程,然后使用myconvnet=MyConvNet()得到可用于学习的网络myconvnet。 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mez_Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值