第P7周:咖啡豆识别(VGG-16复现)

news/2025/1/12 19:51:45/

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/rbOOmire8OocQ90QM78DRA) 中的学习记录博客**
>- **🍖 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)**

一、前期工作

import torch
import torch.nn as nn
import torchvision.transforms as transforms
import torchvision
from torchvision import transforms, datasets
import os,PIL,pathlib,warningswarnings.filterwarnings("ignore")             #忽略警告信息device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
device



2. 导入数据

import os,PIL,random,pathlibdata_dir = './7-data/'
data_dir = pathlib.Path(data_dir)data_paths  = list(data_dir.glob('*'))
classeNames = [str(path).split("\\")[1] for path in data_paths]
classeNames

# 关于transforms.Compose的更多介绍可以参考:https://blog.csdn.net/qq_38251616/article/details/124878863
train_transforms = transforms.Compose([transforms.Resize([224, 224]),  # 将输入图片resize成统一尺寸# transforms.RandomHorizontalFlip(), # 随机水平翻转transforms.ToTensor(),          # 将PIL Image或numpy.ndarray转换为tensor,并归一化到[0,1]之间transforms.Normalize(           # 标准化处理-->转换为标准正太分布(高斯分布),使模型更容易收敛mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # 其中 mean=[0.485,0.456,0.406]与std=[0.229,0.224,0.225] 从数据集中随机抽样计算得到的。
])test_transform = transforms.Compose([transforms.Resize([224, 224]),  # 将输入图片resize成统一尺寸transforms.ToTensor(),          # 将PIL Image或numpy.ndarray转换为tensor,并归一化到[0,1]之间transforms.Normalize(           # 标准化处理-->转换为标准正太分布(高斯分布),使模型更容易收敛mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # 其中 mean=[0.485,0.456,0.406]与std=[0.229,0.224,0.225] 从数据集中随机抽样计算得到的。
])total_data = datasets.ImageFolder("./7-data/",transform=train_transforms)
total_data

3. 划分数据集





二、手动搭建VGG-16模型

VGG-16结构说明:

●13个卷积层(Convolutional Layer),分别用blockX_convX表示
●3个全连接层(Fully connected Layer),分别用fcX与predictions表示
●5个池化层(Pool layer),分别用blockX_pool表示

VGG-16包含了16个隐藏层(13个卷积层和3个全连接层),故称为VGG-16

这里,我制作了一个视频来展示VGG-16的传播过程

play

0:00/0:22

倍速

volumeUp

fullscreen

fullscreen

VGG-16网络动画展示

FC7

FE8

FC6

7*7*512

1*1*512

1*1*1000

1*1*512

CONV5

CONV4

14*14*512

CONV3

28*28*512

CONV2

56*56*256

112*112*128

CONVOLUTION+RELU

K同学啊制作

MAX POOLING

CONVI

百度/谷歌/微信搜索:K同学啊

224*224*64

FULLY CONNECTED+RELU

image.png


1. 搭建模型



2. 查看模型详情


三、 训练模型
1. 编写训练函数


2. 编写测试函数

测试函数和训练函数大致相同,但是由于不进行梯度下降对网络权重进行更新,所以不需要传入优化器


3. 正式训练

model.train()、model.eval()训练营往期文章中有详细的介绍。

📌如果将优化器换成 SGD 会发生什么呢?请自行探索接下来发生的诡异事件的原因。



四、 结果可视化
1. Loss与Accuracy图

 

TRAINING AND VALIDATION ACCURACY

TRAINING AND

VALIDATION LOSS

1.4

1.0

TRAINING LOSS

1.2

TEST LOSS

1.0

0.8

0.8

0.6

0.6

0.4

0.4

0.2

TRAINING ACCURACY

TEST ACCURACY

0.0

75

35

15

35

25

20

40

30

40

30

output_29_0.png


2. 指定图片进行预测
 

Python复制代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

from PIL import Image

classes = list(total_data.class_to_idx)

def predict_one_image(image_path, model, transform, classes):

test_img = Image.open(image_path).convert('RGB')

plt.imshow(test_img) # 展示预测的图片

test_img = transform(test_img)

img = test_img.to(device).unsqueeze(0)

model.eval()

output = model(img)

_,pred = torch.max(output,1)

pred_class = classes[pred]

print(f'预测结果是:{pred_class}')

Python复制代码

1

2

3

4

5

# 预测训练集中的某张照片

predict_one_image(image_path='./7-data/Dark/dark (1).png',

model=model,

transform=train_transforms,

classes=classes)

Plain Text复制代码

1

预测结果是:Dark

25

50

75

100

125

150

175

200

50

100

150

200

output_32_1.png


3. 模型评估
 

Python复制代码

1

2

best_model.eval()

epoch_test_acc, epoch_test_loss = test(test_dl, best_model, loss_fn)

Python复制代码

1

epoch_test_acc, epoch_test_loss

Plain Text复制代码

1

(0.9916666666666667, 0.035762640996836126)

Python复制代码

1

2

# 查看是否与我们记录的最高准确率一致

epoch_test_acc

Plain Text复制代码

1

0.9916666666666667


http://www.ppmy.cn/news/1270794.html

相关文章

明明随机数

明明想在学校中请一些同学一起做一项问卷调查&#xff0c;为了实验的客观性&#xff0c;他先用计算机生成了N个1到1000之间的随机整数(N<100)&#xff0c;对于其中重复的数字&#xff0c;只保留一个&#xff0c;把其余相同的数去掉&#xff0c;不同的数对应着不同的学生的学…

一个简单的cmake模板(C++)

链接&#xff1a;小黑屋1024 / Python GitCode #对cmake版本的要求&#xff0c;此处不低于3.16 cmake_minimum_required(VERSION 3.16)#项目名称&#xff1a;此处为test project(test)#设置编译生成产物输出路径 ##可执行文件exe SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURC…

C#科学绘图之scottPlot绘制多个图像

文章目录 示例移除图像图例信号图 scott系列&#xff1a;绘图初步 示例 从名字就能看出&#xff0c;ScottPlot的绘图函数AddScatter的作用是为图窗添加数据点&#xff0c;换言之&#xff0c;每调用一次AddScatter&#xff0c;就可以在图窗中添加一组图像。下面添加两个按钮&a…

AI:ElasticSearch

ElasticSearch是一款开源的分布式搜索引擎和数据分析引擎&#xff0c;主要用于处理海量数据并提供近实时的搜索和分析功能。它具有全文检索、结构化检索和数据分析等特点&#xff0c;能够满足各种复杂的搜索需求。ElasticSearch使用Java编写&#xff0c;可以运行在多个服务器上…

线性代数运算方法总结

线性方程组的行列式解法&#xff08;克拉默法则&#xff09; 首先写出方程的系数行列式&#xff0c;第一列x1第二列x2以此类推&#xff0c;然后用每个方程式的结果分别代替第一列到第列&#xff0c;得到每个未知数对应的代数行列式&#xff0c;方程的解为代数行列式比系数行列…

docker整体环境转移

最近配了个docker&#xff0c;配完才发现&#xff0c;有点小G&#xff0c;还得自己安装cuda&#xff0c;有点麻烦&#xff0c;如果选择重新在新的cuda镜像上安装&#xff0c;也不轻松&#xff0c;所以找了下资料&#xff0c;搞出来了docker整体转移 首先介绍一个命令 docker c…

ubuntu dns 相关

查看dns配置 systemd-resolve --status 修改dns vim /etc/resolv.conf sudo apt install traceroute 追踪 traceroute www.baidu.com

ICC2:OPT-001的error如何解决

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 先看一下这个error的描述: 问题的起因是更新了upf文件&#xff0c;对比发现新增了部分ip的pg supply net/port的定义(VDD_IP)&#xff0c;而这些net并没有在MCMM文件中声明电压…