合肥网站设计建设公司,专门做家具网站,网站安全建设总结,门户网站开发过程手写的数字识别
知名度最高的数据集#xff1a;MNIST 1.训练数据#xff1a;50000
2.测试数据#xff1a;50000
3.图像大小#xff1a;28✖28
4.10类
总结
1.LeNet是早期成功的神经网络
2.先使用卷积层来学习图片空间信息
3.使用全连接层来转换到类别空间
代码实现…手写的数字识别
知名度最高的数据集MNIST 1.训练数据50000
2.测试数据50000
3.图像大小28✖28
4.10类
总结
1.LeNet是早期成功的神经网络
2.先使用卷积层来学习图片空间信息
3.使用全连接层来转换到类别空间
代码实现
LeNet由两部分组成卷积编码器和全连接层密集块
import torch
from torch import nn
from d2l import torch as d2lclass Reshape(torch.nn.Module):def forward(self,x):return x.view(-1,1,28,28) # 原图28✖28填充后是32✖32net nn.Sequential(nn.Conv2d(1, 6, kernel_size5, padding2), nn.Sigmoid(), # 6个通道nn.AvgPool2d(kernel_size2, stride2),nn.Conv2d(6, 16, kernel_size5), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Flatten(),nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),nn.Linear(120, 84), nn.Sigmoid(),nn.Linear(84, 10))我们将一个大小为28✖28的单通道黑白图像通过LeNet。
X torch.rand(size(1, 1, 28, 28), dtypetorch.float32)
for layer in net:X layer(X)print(layer.__class__.__name__,output shape: \t,X.shape)Conv2d output shape: torch.Size([1, 6, 28, 28])
Sigmoid output shape: torch.Size([1, 6, 28, 28])
AvgPool2d output shape: torch.Size([1, 6, 14, 14])
Conv2d output shape: torch.Size([1, 16, 10, 10])
Sigmoid output shape: torch.Size([1, 16, 10, 10])
AvgPool2d output shape: torch.Size([1, 16, 5, 5])
Flatten output shape: torch.Size([1, 400])
Linear output shape: torch.Size([1, 120])
Sigmoid output shape: torch.Size([1, 120])
Linear output shape: torch.Size([1, 84])
Sigmoid output shape: torch.Size([1, 84])
Linear output shape: torch.Size([1, 10])在整个卷积块中与上一层相比每一层特征的高度和宽度都减小了。
第一个卷积层使用2个像素的填充来补偿5✖5卷积核导致的特征减少。
相反第二个卷积层没有填充因此高度和宽度都减少了4个像素。
随着层叠的上升通道的数量从输入时的1个增加到第一个卷积层之后的6个再到第二个卷积层之后的16个。
同时每个汇聚层的高度和宽度都减半。最后每个全连接层减少维数最终输出一个维数与结果分类数相匹配的输出。
LeNet在Fashion-MNIST数据集上的表现
batch_size 256
train_iter, test_iter d2l.load_data_fashion_mnist(batch_sizebatch_size)
# 下载fashion_MNIST数据集Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz
Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz to ../data/FashionMNIST/raw/train-images-idx3-ubyte.gz100%|██████████| 26421880/26421880 [00:0200:00, 9258920.33it/s] Extracting ../data/FashionMNIST/raw/train-images-idx3-ubyte.gz to ../data/FashionMNIST/rawDownloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz
Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz to ../data/FashionMNIST/raw/train-labels-idx1-ubyte.gz100%|██████████| 29515/29515 [00:0000:00, 171125.91it/s]Extracting ../data/FashionMNIST/raw/train-labels-idx1-ubyte.gz to ../data/FashionMNIST/rawDownloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz
Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz to ../data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz100%|██████████| 4422102/4422102 [00:0100:00, 3169968.34it/s]Extracting ../data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz to ../data/FashionMNIST/rawDownloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz
Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz to ../data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz100%|██████████| 5148/5148 [00:0000:00, 4336669.41it/s]Extracting ../data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz to ../data/FashionMNIST/raw/usr/local/lib/python3.10/dist-packages/torch/utils/data/dataloader.py:558: UserWarning: This DataLoader will create 4 worker processes in total. Our suggested max number of worker in current system is 2, which is smaller than what this DataLoader is going to create. Please be aware that excessive worker creation might get DataLoader running slow or even freeze, lower the worker number to avoid potential slowness/freeze if necessary.warnings.warn(_create_warning_msg(def evaluate_accuracy_gpu(net, data_iter, deviceNone): #计算模型精度使用GPU计算模型在数据集上的精度if isinstance(net, nn.Module):net.eval() # 设置为评估模式if not device:device next(iter(net.parameters())).device# 正确预测的数量总预测的数量metric d2l.Accumulator(2)with torch.no_grad():for X, y in data_iter:if isinstance(X, list):# BERT微调所需的之后将介绍X [x.to(device) for x in X]else:X X.to(device)y y.to(device)metric.add(d2l.accuracy(net(X), y), y.numel())return metric[0] / metric[1]训练函数
1.训练函数train_ch6也类似于3.6节中定义的train_ch3。
2.使用高级API创建的模型作为输入并进行相应的优化。
3.Xavier随机初始化模型参数。 4.使用交叉熵损失函数和小批量随机梯度下降。
#用GPU训练模型比第三章多了device
def train_ch6(net, train_iter, test_iter, num_epochs, lr, device):用GPU训练模型(在第六章定义)def init_weights(m):if type(m) nn.Linear or type(m) nn.Conv2d:nn.init.xavier_uniform_(m.weight)net.apply(init_weights)print(training on, device)net.to(device)optimizer torch.optim.SGD(net.parameters(), lrlr)loss nn.CrossEntropyLoss()animator d2l.Animator(xlabelepoch, xlim[1, num_epochs], # 动画效果legend[train loss, train acc, test acc])timer, num_batches d2l.Timer(), len(train_iter)for epoch in range(num_epochs):# 训练损失之和训练准确率之和样本数metric d2l.Accumulator(3)net.train()for i, (X, y) in enumerate(train_iter):timer.start()optimizer.zero_grad()X, y X.to(device), y.to(device)y_hat net(X)l loss(y_hat, y)l.backward()optimizer.step()with torch.no_grad():metric.add(l * X.shape[0], d2l.accuracy(y_hat, y), X.shape[0])timer.stop()train_l metric[0] / metric[2]train_acc metric[1] / metric[2]if (i 1) % (num_batches // 5) 0 or i num_batches - 1:animator.add(epoch (i 1) / num_batches,(train_l, train_acc, None))test_acc evaluate_accuracy_gpu(net, test_iter)animator.add(epoch 1, (None, None, test_acc))print(floss {train_l:.3f}, train acc {train_acc:.3f}, ftest acc {test_acc:.3f})print(f{metric[2] * num_epochs / timer.sum():.1f} examples/sec fon {str(device)})训练和评估LeNet-5模型。
lr, num_epochs 0.9, 10
train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())loss 0.461, train acc 0.827, test acc 0.793
35664.6 examples/sec on cuda:0