Advertisement

Convolutional Neural Networks and Fashion MNIST: Implem

阅读量:

作者:禅与计算机程序设计艺术

1.简介

1.1 作者简介

担任CTO一职,在优酷网视频科技部担任过总监。
曾在Google Brain部门担任负责人角色。
现目前在百度AI基础研发团队中担任相关职务。
主要专注于强化学习、机器学习和计算机视觉等前沿领域的研究与开发。

1.2 文章概要

本文旨在阐述卷积神经网络(CNN)的基础知识和基本概念,并用于对服装图片中的服饰类别进行识别。本文的内容结构如下:

  1. 背景介绍
    该研究旨在探索...的基础上展开深入分析。
    2. 基本概念术语说明
    其中涉及的关键术语包括...等核心概念。
    3. 核心算法原理和具体操作步骤以及数学公式讲解
    该算法基于...理论构建模型,并通过以下步骤实现目标...:
    首先...; 其次...; 最后... 。
    数学表达式如下: y = f(x)
    4. 具体代码实例和解释说明
    下面提供一段具体的Python代码片段:
    python 复制代码
    def main():  
        # 示例功能实现  
        pass  
    此外, 相关功能的具体实现细节如下: ... 。
    5. 未来发展趋势与挑战
    随着技术的发展, ...领域仍面临着诸多挑战, 包括...等关键问题。
    6. 附录常见问题与解答
    常见问题包括以下几点: ...等疑问, 解答如下: ... 。

1.3 本文的阅读对象

  • 具备基础了解计算机视觉和机器学习的相关领域的读者。
  • 热衷于研究深度学习的学者及关注深度神经网络架构设计与优化的学习者。

1.4 文章的读者群体

  • 初学程序员和数据分析专家。
  • 具备基本计算机知识,并大致掌握深度学习的基本概念。

2. 背景介绍

伴随着互联网的发展趋势不断推进,在线商城、社交媒体平台以及移动应用等技术手段逐渐完善的过程中

本文旨在阐述卷积神经网络(Convolutional Neural Network, CNN)的基本原理和核心内容,并利用其来进行服装图像中各类服饰的分类识别。

3. 基本概念术语说明

3.1 卷积

卷积运算基于两个函数之间的卷积关系,在二维输入数据上施加滤波器以生成新的二维输出数据。给定一个输入矩阵I \in R^{m\times n}, 其对应的卷积核K \in R^{p\times q}其尺寸为p\times q。该操作其本质是对对应元素进行乘法运算后再进行加权求和。在实际计算中, 卷积过程是通过遍历输入矩阵并滑动滤波器到每个子窗口内进行逐个元素相乘后再累加计算得到结果。

3.2 池化层

池化层(Pooling layer)的主要功能是通过下采样技术进一步减小特征图(Feature map)的空间维度,并有效降低了模型的整体复杂度。常采用非线性运算来处理数据区域的最大值或平均值作为输出指标。 pool层的作用类似于经典的降维方法, 能够有效地减少模型的计算负担和参数规模.

3.3 全连接层

全连接层(Fully connected layer)即为神经网络的重要组成部分,并负责将输入信号传递到输出结果。其主要功能是通过密集型权重矩阵将各层之间的特征进行非线性变换与融合。通常情况下,默认设置下该层节点数量会为其上一层节点数量乘以一个倍率因子;另外一种常见的技术是采用Dropout方法随机去除部分节点单元以减少模型复杂度并提升泛化能力;同时为了防止模型在训练过程中出现过拟合现象还可以结合正则化方法进行约束优化

3.4 激活函数

激活函数(Activation function)可被视为模拟非线性关系的重要工具,在深度学习模型中发挥着关键作用。常见的激活函数包括Sigmoid、tanh和ReLU等。

3.5 Softmax函数

Softmax函数是一种用于将输入向量转换为概率分布的归一化方法。该函数接收输入向量,并生成一个每个元素位于区间[0,1]内且各元素之和等于1的概率分布。该方法常用于多分类任务,在输出层中的多个神经元被转化为概率形式以表示各类别的可能性。

3.6 误差反向传播

误差反向传播(Backpropagation)被称为一种训练神经网络的方法,在该过程中,神经网络的参数被优化以最小化预测误差,并最终实现较高的预测精度。该算法基于链式法则进行求导过程,并采用梯度下降(Gradient descent)方法更新各层参数。

4. 核心算法原理和具体操作步骤以及数学公式讲解

4.1 数据集

该数据集专门收集服装类图片,并包含了28x28像素分辨率的70,000张不同类别的服装图片样本。其中包含T恤、裤子、套头衫、连衣裙和外套五个分类标签。这些标签按照顺序排列提供了分类依据。

4.2 模型设计

本研究采用的网络架构基于LeNet-5模型设计。该网络由四个卷积(Conv)操作和三个全连接(FC)操作模块构成。具体而言,在输入端首先设置了一维卷积操作:第一卷积(Conv1)操作参数配置为卷积核尺寸为5×5像素并输出通道数设为6个。随后经过第二步最大池化(MaxPool)操作:其池化窗口尺寸设定为2×2像素大小的操作单元。接着进入第三步操作:第三卷积(Conv3)操作参数设置为其卷积核尺寸同样维持在5×5像素但输出通道数目提升至16个通道量级上。第四步则采用了最大池化操作:与前一阶段相同的是其池化窗口尺寸也被设定为了2×2像素大小的操作单元结构特征图量度减少的同时保证了关键特征信息的有效提取过程继续进行下一步即第五步完全连接(FC)操作环节:第五个完全连接(FC)操作单元包含了120个神经元数量级的操作单元数目较之于前一层有所减少但并未完全消失随后接通第六步完全连接(FC)操作环节并将其神经元数目配置至84个节点水平上最终通过分类器输出端实现各类服装图像的概率分布预测功能

4.3 优化算法

在训练过程中,采用了Adam优化器。Adam优化器源自Momentum优化器的发展版本,并融合了其动态调节学习率的策略以及对初始学习率进行合理的设置。

4.4 参数初始化

在模型训练过程中,卷积层中的权重参数W、偏置参数b以及全连接层中的权重参数W、偏置参数b均进行了参数初始化。其中采用Xavier随机数分布法进行参数初始化以提升模型收敛速度,在全连接层中则采用了He正规化策略进行参数设置以优化网络性能

4.5 激活函数

使用ReLU作为激活函数。

4.6 Dropout层

该方法采用Dropout层作为防止过拟合的技术手段。该技术通过随机抑制部分神经元活动以实现对模型复杂性的控制。其丢弃概率配置为0.5。

4.7 Loss函数

采用交叉熵损失函数。

4.8 Batch Normalization

Batch Normalization模块被放置于卷积层与全连接层之间,并对中间层的输出数据实施归一化处理。

4.9 超参数调优

超参数优化过程涉及调整学习速率、批量大小以及相关的激活函数设置和丢弃比率等Batch Normalization layer和优化算法。

4.10 模型评估

在测试集上计算准确率。

5. 具体代码实例和解释说明

5.1 数据加载

复制代码
    import torch
    from torchvision import datasets, transforms
    train_loader = DataLoader(datasets.FashionMNIST('./data', 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.FashionMNIST('./data', train=False, transform=transforms.Compose([
                              transforms.ToTensor(),
                              transforms.Normalize((0.5,), (0.5,))
                          ])), batch_size=BATCH_SIZE, shuffle=True)
    
      
      
      
      
      
      
      
      
      
    
    代码解读

FashionMNIST的DataLoader实现,数据下载、预处理。

5.2 LeNet-5模型定义

复制代码
    class LeNet(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(1, 6, kernel_size=(5,5)) # 输入通道数为1,输出通道数为6,卷积核大小为5×5
        self.pool1 = nn.MaxPool2d(kernel_size=(2,2), stride=2) # 最大池化,池化核大小为2×2,步长为2
        self.conv2 = nn.Conv2d(6, 16, kernel_size=(5,5)) # 输入通道数为6,输出通道数为16,卷积核大小为5×5
        self.pool2 = nn.MaxPool2d(kernel_size=(2,2), stride=2) # 最大池化,池化核大小为2×2,步长为2
        self.fc1 = nn.Linear(16 * 4 * 4, 120) # 输入特征大小为16×4×4,输出特征大小为120
        self.bn1 = nn.BatchNorm1d(num_features=120) # BN层
        self.fc2 = nn.Linear(120, 84) # 输入特征大小为120,输出特征大小为84
        self.bn2 = nn.BatchNorm1d(num_features=84) # BN层
        self.fc3 = nn.Linear(84, 10) # 输入特征大小为84,输出特征大小为10
    
    def forward(self, x):
        out = F.relu(self.conv1(x)) # ReLU激活
        out = self.pool1(out) # 最大池化
        out = F.relu(self.conv2(out)) # ReLU激活
        out = self.pool2(out) # 最大池化
        out = out.view(-1, 16 * 4 * 4) # 拉平
        out = F.relu(self.fc1(out)) # ReLU激活
        out = self.bn1(out) # BN层
        out = F.relu(self.fc2(out)) # ReLU激活
        out = self.bn2(out) # BN层
        out = self.fc3(out) # softmax输出
    
        return out
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

LeNet-5模型的定义,包括卷积层、池化层、BN层和全连接层。

5.3 训练过程

复制代码
    def train():
    net = LeNet().to(device)
    optimizer = optim.Adam(net.parameters())
    criterion = nn.CrossEntropyLoss()
    
    for epoch in range(EPOCHS):
        running_loss = 0.0
        correct = 0
    
        for i, data in enumerate(train_loader, 0):
            inputs, labels = data
    
            inputs = inputs.to(device)
            labels = labels.to(device)
    
            optimizer.zero_grad()
    
            outputs = net(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
    
            _, predicted = torch.max(outputs.data, 1)
            correct += (predicted == labels).sum().item()
            print('[%d, %5d] loss:%.3f' %(epoch + 1, (i+1)*len(inputs), loss.item()))
    
        accu = 100 * float(correct) / len(train_dataset)
        print('accuracy:', round(accu, 2), '%')
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

训练过程,包括设置设备、模型、优化器、损失函数、训练轮数、迭代次数。

5.4 测试过程

复制代码
    with torch.no_grad():
    correct = 0
    total = 0
    for data in test_loader:
        images, labels = data
        images, labels = images.to(device), labels.to(device)
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()
    
    print('Accuracy of the network on the test set: %.2f %%' % (100 * float(correct) / total))
    
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

测试过程,在测试集上进行模型评估,打印准确率。

5.5 命令行运行

复制代码
    if __name__ == '__main__':
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    EPOCHS = 5
    BATCH_SIZE = 64
    train()
    
      
      
      
      
    
    代码解读

命令行运行脚本,包括设备类型、训练轮数、批量大小。

6. 未来发展趋势与挑战

伴随着技术迭代升级的趋势

7. 附录常见问题与解答

全部评论 (0)

还没有任何评论哟~