5.5 卷积神经网络(LeNet)

卷积神经网络(LeNet)

多层感知机构成的全连接层对Fashion-MNIST数据集中的图像进行分类。每张图像高和宽均是28像素。我们将图像中的像素逐行展开,得到长度为784的向量,并输入进全连接层中。然而,这种分类方法有一定的局限性。

  1. 图像在同一列邻近的像素在这个向量中可能相距较远。它们构成的模式可能难以被模型识别。
  2. 对于大尺寸的输入图像,使用全连接层容易导致模型过大。假设输入是高和宽均为(1,000)像素的彩色照片(含3个通道)。即使全连接层输出个数仍是256,该层权重参数的形状也是(3,000,000 imes 256):它占用了大约3 GB的内存或显存。这会带来过于复杂的模型和过高的存储开销。
    卷积层尝试解决这两个问题。一方面,卷积层保留输入形状,使图像的像素在高和宽两个方向上的相关性均可能被有效识别;另一方面,卷积层通过滑动窗口将同一卷积核与不同位置的输入重复计算,从而避免参数尺寸过大。

LeNet模型

LeNet分为卷积层块和全连接层块两个部分
卷积层块里的基本单位是卷积层后接最大池化层:卷积层用来识别图像里的空间模式,如线条和物体局部,之后的最大池化层则用来降低卷积层对位置的敏感性。卷积层块里的基本单位是卷积层后接最大池化层,在卷积层块中,每个卷积层都使用(5 imes 5)的窗口,并在输出上使用(sigmoid)激活函数
卷积层块的输出形状为(批量大小, 通道, 高, 宽)。当卷积层块的输出传入全连接层块时,全连接层块会将小批量中每个样本变平(flatten)。也就是说,全连接层的输入形状将变成二维,其中第一维是小批量中的样本,第二维是每个样本变平后的向量表示,且向量长度为通道、高和宽的乘积。

import d2lzh as d2l
import mxnet as mx
from mxnet import autograd, gluon, init, nd
from mxnet.gluon import loss as gloss, nn
import time
#初始化net
net = nn.Sequential()
#添加卷积层通道数:6,卷积层:5,激活函数:sigmod
net.add(nn.Conv2D(channels=6, kernel_size=5, activation='sigmoid'),
        #最大池化层:2,步幅:2
        nn.MaxPool2D(pool_size=2, strides=2),
        #添加卷积层通道数:16,卷积层:5,激活函数:sigmod
        nn.Conv2D(channels=16, kernel_size=5, activation='sigmoid'),
        #最大池化层:2,步幅:2
        nn.MaxPool2D(pool_size=2, strides=2),
        # Dense会默认将(批量大小, 通道, 高, 宽)形状的输入转换成
        # (批量大小, 通道 * 高 * 宽)形状的输入
        nn.Dense(120, activation='sigmoid'),
        nn.Dense(84, activation='sigmoid'),
        nn.Dense(10))

构造一个高和宽均为28的单通道数据样本,并逐层进行前向计算来查看每个层的输出形状

# 初始化输入样本
X = nd.random.uniform(shape=(1, 1, 28, 28))
# 初始化net参数
net.initialize()
# 循环net层
for layer in net:
    X = layer(X)
    print(layer.name, 'output shape:	', X.shape)

获取数据和训练模型

使用Fashion-MNIST作为训练数据集

# 批次大小:256
batch_size = 256
# 获得训练集,测试集
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size=batch_size)

evaluate_accuracy函数:

# 计算准确率
def evaluate_accuracy(data_iter, net, ctx):
    acc_sum, n = nd.array([0], ctx=ctx), 0
    for X, y in data_iter:
        # 如果ctx代表GPU及相应的显存,将数据复制到显存上
        # 得到输入集,标签
        X, y = X.as_in_context(ctx), y.as_in_context(ctx).astype('float32')
        # 计算误差
        acc_sum += (net(X).argmax(axis=1) == y).sum()
        n += y.size
    # 计算平均误差
    return acc_sum.asscalar() / n

train_ch3函数:

# 本函数已保存在d2lzh包中方便以后使用
def train_ch5(net, train_iter, test_iter, batch_size, trainer, ctx,
              num_epochs):
    # 输出一下是cpu还是gpu
    print('training on', ctx)
    # 得到交叉熵损失函数
    loss = gloss.SoftmaxCrossEntropyLoss()
    for epoch in range(num_epochs):
        train_l_sum, train_acc_sum, n, start = 0.0, 0.0, 0, time.time()
        for X, y in train_iter:
            # 将X,y数据复制到gpu上
            X, y = X.as_in_context(ctx), y.as_in_context(ctx)
            with autograd.record():
                # 计算出预测数据
                y_hat = net(X)
                # 求loss
                l = loss(y_hat, y).sum()
            l.backward()
            # 迭代
            trainer.step(batch_size)
            y = y.astype('float32')
            train_l_sum += l.asscalar()
            train_acc_sum += (y_hat.argmax(axis=1) == y).sum().asscalar()
            n += y.size
        test_acc = evaluate_accuracy(test_iter, net, ctx)
        print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f, '
              'time %.1f sec'
              % (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc,
                 time.time() - start))

重新将模型参数初始化到设备变量ctx之上,并使用Xavier随机初始化。损失函数和训练算法则依然使用交叉熵损失函数和小批量随机梯度下降。

lr, num_epochs = 0.9, 5
net.initialize(force_reinit=True, ctx=ctx, init=init.Xavier())
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': lr})
train_ch5(net, train_iter, test_iter, batch_size, trainer, ctx, num_epochs)
# output:
training on gpu(0)
epoch 1, loss 2.3082, train acc 0.113, test acc 0.293, time 21.3 sec
epoch 2, loss 1.2689, train acc 0.492, test acc 0.612, time 16.4 sec
epoch 3, loss 0.8517, train acc 0.665, test acc 0.730, time 13.6 sec
epoch 4, loss 0.6973, train acc 0.725, test acc 0.744, time 15.0 sec
epoch 5, loss 0.6355, train acc 0.748, test acc 0.763, time 20.0 sec
原文地址:https://www.cnblogs.com/strategist-614/p/14459182.html