
安全好用的OpenApi
说到深度学习,大概很多人都会想到那些能够“看图识物”的神经网络,比如帮手机识别照片里的猫咪,或者让汽车知道眼前是红灯还是绿灯。今天,我想跟大家聊聊两位“大功臣”——LeNet和AlexNet。这两位神经网络“大咖”不仅改变了计算机如何看世界,也推动了人工智能的飞速发展。
LeNet是个“老前辈”,上世纪90年代就已经登场,堪称神经网络家族的开山鼻祖之一。而AlexNet则是后起之秀,它的横空出世,直接点燃了深度学习的热潮。虽然它们“出道”时间相隔了将近20年,但从LeNet到AlexNet的发展过程,正好展现了神经网络从“小打小闹”到“大展拳脚”的成长故事。
接下来,我们就一起走进LeNet和AlexNet的世界,看看它们有什么不同,又是如何一步步让“机器看懂图片”变得如此神奇的。别担心,我会尽量用简单易懂的语言,让你轻松看明白。
LeNet 是卷积神经网络(CNN)中的鼻祖级架构,由 Yann LeCun 等人在 1990 年提出,最初是为了手写数字识别任务设计的,比如 MNIST 数据集。虽然它的结构现在看起来比较简单,但当时已经相当创新了,尤其是它的卷积和池化思想,奠定了现代深度学习图像处理的基础。
你可以把 LeNet 想象成一个特征提取加分类器的组合机器:前面几层(卷积+池化)负责找到图片的特征,比如边缘和纹理;后面几层(全连接)则把这些特征“翻译”成分类结果。
LeNet 的核心分成两部分:卷积层块和全连接层块。
假设我们输入的图片大小是 32×32 的灰度图,LeNet 每层的输出形状如下:
接下来,我们用 MXNet 框架来实现 LeNet,看看它的每一层是如何工作的:
from mxnet.gluon import nn
from mxnet import nd
# 定义 LeNet 网络
net = nn.Sequential()
net.add(
nn.Conv2D(channels=6, kernel_size=5, activation='sigmoid'),
nn.MaxPool2D(pool_size=2, strides=2),
nn.Conv2D(channels=16, kernel_size=5, activation='sigmoid'),
nn.MaxPool2D(pool_size=2, strides=2),
nn.Dense(120, activation='sigmoid'),
nn.Dense(84, activation='sigmoid'),
nn.Dense(10)
)
# 初始化网络
net.initialize()
# 测试网络
X = nd.random.uniform(shape=(1,1,28,28))# 输入一张随机图片
for layer in net:
X = layer(X)
print(f"{layer.name} output shape: {X.shape}")
运行结果类似这样:
conv0 output shape: (1,6,24,24)
pool0 output shape:(1,6,12,12)
conv1 output shape:(1,16,8,8)
pool1 output shape:(1,16,4,4)
dense0 output shape:(1,120)
dense1 output shape:(1,84)
dense2 output shape:(1,10)
我们用 Fashion-MNIST 数据集(类似 MNIST,但更复杂)来训练 LeNet。
from mxnet import gluon, autograd, init
from mxnet.gluon import loss as gloss,Trainer
import time
# 加载数据
batch_size =256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
# 定义训练函数
def train_ch5(net, train_iter, test_iter, batch_size, trainer, ctx, num_epochs):
loss = gloss.SoftmaxCrossEntropyLoss()
for epoch inrange(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 = X.as_in_context(ctx), y.as_in_context(ctx)
with autograd.record():
y_hat = net(X)
l = loss(y_hat, y).sum()
l.backward()
trainer.step(batch_size)
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(f"epoch {epoch+1}, loss {train_l_sum/n:.4f}, train acc {train_acc_sum/n:.3f}, test acc {test_acc:.3f}, time {time.time()-start:.1f} sec")
# 初始化并训练
ctx = d2l.try_gpu()
net.initialize(force_reinit=True, ctx=ctx, init=init.Xavier())
trainer =Trainer(net.collect_params(),'sgd',{'learning_rate':0.9})
train_ch5(net, train_iter, test_iter, batch_size, trainer, ctx,5)
在 Fashion-MNIST 上,LeNet 的初始准确率可能不太高,但随着训练,最终可以达到 70%-75% 的测试准确率。这对于一个早期设计的网络来说已经不错了!
如果要进一步提升:
简单点说,LeNet 是一个很棒的起点,但我们可以在它的基础上玩出很多花样,构建更强大的模型!
接下来再来讲讲深度学习的里程碑模型AlexNet。
在 2012 年之前,计算机视觉主要依赖于手工设计的特征,如 SIFT、HOG 等。
然而,这种方法需要大量的经验和试验,且在面对复杂数据时难以扩展。AlexNet 的出现彻底改变了这一局面,它证明了端到端学习的深度神经网络能够在复杂任务上超越传统方法,成为深度学习历史上的重要里程碑。
早期的神经网络,如 LeNet,虽然在小数据集(如 MNIST)上表现出色,但受限于计算资源和数据规模,在更复杂的任务中难以超越其他机器学习方法(如支持向量机)。下面就是两个比较关键的问题:
随着ImageNet 数据集和GPU 的广泛应用,这两个限制逐渐被突破,为 AlexNet 的成功奠定了基础。
AlexNet 的设计与 LeNet 类似,但在以下方面进行了显著改进:
模型结构
以下代码展示了 AlexNet 的网络结构。
from mxnet.gluon import nn
net = nn.Sequential()
# 第一层:卷积 + 最大池化
net.add(nn.Conv2D(96, kernel_size=11, strides=4, activation='relu'),
nn.MaxPool2D(pool_size=3, strides=2))
# 第二层:卷积 + 最大池化
net.add(nn.Conv2D(256, kernel_size=5, padding=2, activation='relu'),
nn.MaxPool2D(pool_size=3, strides=2))
# 第三到第五层:连续卷积
net.add(nn.Conv2D(384, kernel_size=3, padding=1, activation='relu'),
nn.Conv2D(384, kernel_size=3, padding=1, activation='relu'),
nn.Conv2D(256, kernel_size=3, padding=1, activation='relu'),
nn.MaxPool2D(pool_size=3, strides=2))
# 全连接层:带丢弃法
net.add(nn.Dense(4096, activation="relu"), nn.Dropout(0.5),
nn.Dense(4096, activation="relu"), nn.Dropout(0.5),
nn.Dense(10)) # 输出层,10 个类别(用于 Fashion-MNIST 数据集)
通过给定一个高和宽为 224 的输入图像,我们可以观察每一层的输出形状。
from mxnet import nd
X = nd.random.uniform(shape=(1, 1, 224, 224))
net.initialize()
for layer in net:
X = layer(X)
print(layer.name, 'output shape:\t', X.shape)
输出示例:
conv0 output shape: (1,96,54,54)
pool0 output shape:(1,96,26,26)
conv1 output shape:(1,256,26,26)
pool1 output shape:(1,256,12,12)
...
dense2 output shape:(1,10)
AlexNet 原本使用 ImageNet 数据集,但由于训练时间较长,我们使用 Fashion-MNIST 数据集来演示。以下代码将图像的大小调整为 224×224。
from mxnet.gluon.data.vision import transforms
from mxnet.gluon.data import DataLoader
from mxnet.gluon.data.vision import FashionMNIST
def load_data_fashion_mnist(batch_size, resize=None):
transformer =[]
if resize:
transformer.append(transforms.Resize(resize))
transformer.append(transforms.ToTensor())
transformer = transforms.Compose(transformer)
train_set =FashionMNIST(train=True).transform_first(transformer)
test_set =FashionMNIST(train=False).transform_first(transformer)
train_loader =DataLoader(train_set, batch_size, shuffle=True, num_workers=4)
test_loader =DataLoader(test_set, batch_size, shuffle=False, num_workers=4)
return train_loader, test_loader
batch_size =128
train_iter, test_iter = load_data_fashion_mnist(batch_size, resize=224)
以下代码展示了如何训练 AlexNet,并输出训练和测试的准确率。
from mxnet import gluon, init
from mxnet.gluon import Trainer
from mxnet.gluon.loss import SoftmaxCrossEntropyLoss
from d2l import mxnet as d2l
# 定义训练函数
def train_ch5(net, train_iter, test_iter, batch_size, trainer, num_epochs):
loss =SoftmaxCrossEntropyLoss()
for epoch inrange(num_epochs):
train_loss, train_acc, n =0,0,0
for X, y in train_iter:
X, y = X.as_in_context(ctx), y.as_in_context(ctx)
with autograd.record():
y_hat = net(X)
l = loss(y_hat, y)
l.backward()
trainer.step(batch_size)
train_loss += l.sum().asscalar()
train_acc +=(y_hat.argmax(axis=1)== y.astype('float32')).sum().asscalar()
n += y.size
test_acc = evaluate_accuracy(test_iter, net, ctx)
print(f"epoch {epoch + 1}, loss {train_loss/n:.4f}, train acc {train_acc/n:.3f}, test acc {test_acc:.3f}")
# 初始化模型和训练参数
ctx, lr, num_epochs = d2l.try_gpu(),0.01,5
net.initialize(init=init.Xavier(), ctx=ctx)
trainer =Trainer(net.collect_params(),'sgd',{'learning_rate': lr})
# 开始训练
train_ch5(net, train_iter, test_iter, batch_size, trainer, num_epochs)
AlexNet 的成功不仅让深度学习成为研究热点,还为后续模型(如 VGG、ResNet)奠定了基础。希望通过本文,您对 AlexNet 有了清晰的理解!
本文章转载微信公众号@Chal1ceAI