p7 咖啡豆识别
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊 | 接辅导、项目定制
前言
前面一周学会了调用官方的模型,通过冻结模型内部参数然后修改最后一层参数实现了明星分类,这周学会自己搭建模型。
VGG16模型概况
模型搭建函数
nn.Module
nn.Module 是 PyTorch 中构建神经网络模型的基类。所有的神经网络模型都应该继承自 nn.Module 类。nn.Module 提供了一些基本的功能,使得模型能够被正确地追踪、管理参数,以及在需要时移动到 GPU 上。
nn.Sequential
nn.Sequential 是 PyTorch 中的一个容器模块,允许按顺序组织其他模块。它是构建神经网络的一种方便的方式,特别是当网络是按顺序堆叠的情况下。
在 nn.Sequential 中,模块按照它们在序列中的顺序依次被调用。下面是一个简单的例子,演示如何使用 nn.Sequential 构建一个包含卷积层、ReLU 激活函数和池化层的序列:
import torch
import torch.nn as nn
# 定义一个包含卷积、ReLU和池化的简单序列
model = nn.Sequential(
nn.Conv2d(1, 64, kernel_size=3, stride=1, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2)
)
# 输出模型的结构
print(model)
nn.Conv2d
nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0)
in_channels: 输入数据的通道数。对于彩色图像,通道数通常为 3(红、绿、蓝),对于灰度图像,通道数为 1。
out_channels: 输出通道数,即卷积核的数量。每个卷积核都会生成一个输出通道。
kernel_size: 卷积核的大小,可以是一个整数(表示正方形卷积核)或一个元组/列表(表示矩形卷积核)。例如,(3, 3) 表示一个 3x3 的卷积核。
stride: 卷积核在输入上滑动的步幅。如果未指定,将默认使用 1。
padding: 输入的每一侧添加的零填充数量。填充可以帮助保持输入和输出的尺寸一致,特别是在步幅大于 1 时。
nn.Linear
nn.Linear(in_features, out_features, bias=True)
in_features: 输入特征的数量。对于图像数据,通常是展平后的像素数量;对于其他数据,通常是输入特征的数量。
out_features: 输出特征的数量。这决定了层的输出形状。
bias: 如果为 True,则层包含偏置;如果为 False,则不包含。偏置是一个可学习的参数,用于调整层的输出。默认为True
VGG_16完整代码
class vgg16(nn.Module):
def __init__(self):
super(vgg16,self).__init__()
#卷积块1
self.block1=nn.Sequential(
nn.Conv2d(3,64,kernel_size=(3,3),stride=(1,1),padding=(1,1)),
nn.ReLU(),
nn.Conv2d(64,64,kernel_size=(3,3),stride=(1,1),padding=(1,1)),
nn.ReLU(),
nn.MaxPool2d(kernel_size=(2,2),stride=(2,2))
)
#卷积块2
self.block2=nn.Sequential(
nn.Conv2d(64,128,kernel_size=(3,3),stride=(1,1),padding=(1,1)),
nn.ReLU(),
nn.Conv2d(128,128,kernel_size=(3,3),stride=(1,1),padding=(1,1)),
nn.ReLU(),
nn.MaxPool2d(kernel_size=(2,2),stride=(2,2))
)
#卷积块3
self.block3=nn.Sequential(
nn.Conv2d(128,256,kernel_size=(3,3),stride=(1,1),padding=(1,1)),
nn.ReLU(),
nn.Conv2d(256,256,kernel_size=(3,3),stride=(1,1),padding=(1,1)),
nn.ReLU(),
nn.Conv2d(256,256,kernel_size=(3,3),stride=(1,1),padding=(1,1)),
nn.ReLU(),
nn.MaxPool2d(kernel_size=(2,2),stride=(2,2))
)
#卷积块4
self.block4=nn.Sequential(
nn.Conv2d(256,512,kernel_size=(3,3),stride=(1,1),padding=(1,1)),
nn.ReLU(),
nn.Conv2d(512,512,kernel_size=(3,3),stride=(1,1),padding=(1,1)),
nn.ReLU(),
nn.Conv2d(512,512,kernel_size=(3,3),stride=(1,1),padding=(1,1)),
nn.ReLU(),
nn.MaxPool2d(kernel_size=(2,2),stride=(2,2))
)
#卷积块5
self.block5=nn.Sequential(
nn.Conv2d(512,512,kernel_size=(3,3),stride=(1,1),padding=(1,1)),
nn.ReLU(),
nn.Conv2d(512,512,kernel_size=(3,3),stride=(1,1),padding=(1,1)),
nn.ReLU(),
nn.Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)),
nn.ReLU(),
nn.MaxPool2d(kernel_size=(2,2),stride=(2,2))
)
#线性层
self.classifier=nn.Sequential(
nn.Linear(in_features=7*7*512,out_features=4096),
nn.ReLU(),
nn.Linear(in_features=4096,out_features=4096),
nn.ReLU(),
nn.Linear(in_features=4096,out_features=len(classNames))
)
def forward(self,x):
x = self.block1(x)
x = self.block2(x)
x = self.block3(x)
x = self.block4(x)
x = self.block5(x)
x=torch.flatten(x,start_dim=1)
x=self.classifier(x)
return x
模型训练结果
总结
这周学会了自己根据论文所给的参数搭建深度学习模型,并且将模型运用于咖啡豆识别,达到了较好的效果。