众所周知第七章在复现各大神经网络的时候也会用到ch6定义的各种函数,为了方便理解其中的细节,在这里具体讲解一下!
目录
1.LeNet实现
1.1net搭建
这里使用Seq简单复现即可,没啥好说的。
注意:在Sequential里面也是可以写进自己的类的,详细见5_1。
nn.Flatten()是将张量拉成(bs,-1)维度的张量
注意最后送到全连接的input是需要自己算的!另外激活函数为Sigmoid
net = nn.Sequential(
nn.Conv2d(1, 6, kernel_size=5, padding=2), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Conv2d(6, 16, kernel_size=5), nn.Sigmoid(),
nn.AvgPool2d(kernel_size=2, stride=2),
nn.Flatten(),
nn.Linear(16 * 5 * 5, 120), nn.Sigmoid(),
nn.Linear(120, 84), nn.Sigmoid(),
nn.Linear(84, 10))
X = torch.rand(size=(1, 1, 28, 28), dtype=torch.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])
'''
简单用一个28的向量(与FM单张图片hw相同)看一下结构,注意卷积尺寸计算公式:
o=[(i+2p-k)/s]+1这个公式对应正方形尺寸图片卷积尺寸
1.2数据集改正
原始的num_works=4,这里笔者的电脑太拉,用4的话内存不够用,所以改成2(如果2还不行直接上0)
def load_data_fashion_mnist_nw2(batch_size, resize=None):
"""下载Fashion-MNIST数据集,然后将其加载到内存中"""
trans = [transforms.ToTensor()]
if resize:
trans.insert(0, transforms.Resize(resize))
trans = transforms.Compose(trans)
mnist_train = torchvision.datasets.FashionMNIS

文章详细介绍了如何使用PyTorch实现LeNet神经网络,包括网络结构搭建、数据集调整、GPU上的训练过程以及训练命令行。在数据集改正部分,针对内存限制调整了数据加载的线程数。训练过程中,讨论了loss函数的不同reduction选项对训练的影响,并提供了简化后的训练过程显示方式。
最低0.47元/天 解锁文章
1405





