p7 咖啡豆识别

p7 咖啡豆识别

前言

前面一周学会了调用官方的模型,通过冻结模型内部参数然后修改最后一层参数实现了明星分类,这周学会自己搭建模型。

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

模型训练结果

在这里插入图片描述
在这里插入图片描述

总结

这周学会了自己根据论文所给的参数搭建深度学习模型,并且将模型运用于咖啡豆识别,达到了较好的效果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值