Skip to playerSkip to main content
  • 2周前
项目链接:https://github.com/xsm829/Astronomy_Image_Classifier
文字稿
00:00那好,那我们开始我们的第一期的讲解
00:04第一期讲解呢,我们是讲基于PyTouch的深度学习方
00:07式的进行一个心理分类器
00:09然后我的功耗是也是同名的
00:13然后呢,然后我们功耗呢,上面有一个简略的教程,然后给你看一看
00:17当然啊,我这个人比较懒啊,我不会给你写很详细的东西
00:21
00:21因为我自己有很多事要干,对吧
00:24我自己,我不可能所有时间都铺在这上面的
00:28对,所以我就大致写了一个项目概要
00:31对,我们先讲一下项目概要
00:32我们这个是用开构上的一个数据集
00:35叫Astromony Imagic Classifier
00:39就是一个星体图片分类器
00:41然后定位读取每一个星体的文件夹进行一个打标
00:45然后使用Touch和MobilNet的训练模型进行调用返回
00:48预测的标签
00:49一个概率,prob,还有一个confidence,智行度一些的参数
00:54对,这是我们的一个基于PyTouch和深度学习的心理分
00:58类检测
00:59进行功能
01:01然后接下来呢,我们先跳过核心代码展示
01:04我们带大家一起来过一遍
01:06然后最后我们来回顾一下我们的核心代码
01:10首先呢,我们带大家来看一下我们的数据集
01:13构成
01:18我们是一张图片
01:20然后呢,我们就是一个JSON
01:22JSON呢,就对应的一个图片的一个
01:27就是图片一个详细信息的描述
01:29你看比如是version,它什么版本的
01:31flags,打标,checked,false,shapes,什么什么样
01:34
01:36然后我们这个就是星体的图片
01:38你看各种各样的星体的图片
01:42有些是人为标注过的
01:45有些呢,就是自然拍摄的
01:47对吧
01:49还有一些是动图,看到了
01:53好,那现在我们对我们代码来讲一遍
01:55当然我们是基于PyTouch的一个深度学习的分类器
01:58所以我们首先要import一个Touch
02:01所以你看我们就是Touch
02:02然后我们是一个Touch version
02:05Touch version就是Touch里面的视觉处理的板块
02:08然后我们也import什么DataSets
02:10这个模块
02:11Transforms这个模块
02:12还有Models这个模块
02:14这三个模块
02:14然后Optim就是一个优化的
02:17它一个优化器
02:18然后Touch.utlils.data
02:22然后还import一个DataLoader
02:23还有一个RandomSplit
02:25就是那个随机分割器
02:26随机分割器
02:28所以就是我们需要导入的一个模块
02:31接下来呢
02:32我建议大家呢
02:32使用我们的VSCode
02:34然后在我们这儿
02:35把文件夹节拖进去
02:37然后它就可以进行相对路径的一个读取
02:39那你看我们知道它怎么读呢
02:41你看到吧
02:41点告Space Images
02:43就是我们直接就读着文件夹下的Space Images
02:47如果你是那个
02:50如果你是用那个其他的一些的话
02:52或者说你是那个直接
02:54直接一个用Jumpter Notebook的话
02:56那么你在这儿要把绝对路径给写好
02:58如果你是用Jumpter Notebook的话
02:59你把决定路径给写好
03:01否则的话它读取会出错
03:02
03:03然后接下来我们这是一个Transform
03:05我们进行一个转置
03:06我们有这样三个步骤
03:08第一个是Resize
03:08看到吧
03:09Resize 224 224
03:10这个是什么意思
03:11Resize就是我们强制的一个图片的一个重
03:14
03:16大小的一个重定向
03:18你可以扩张
03:19你可以缩放
03:19那么这里我们就缩放到224乘224的像素
03:22为什么呢
03:23它是一个Imaginate模型的一个默认输入尺寸
03:26它是不改变我们的Channels的
03:28它只改变我们的width
03:29还有一个height
03:31对吧
03:32接下来是2tensor
03:332tensor就把它变成什么
03:34变成一个张量
03:36能理解吗
03:37对张量
03:38Tensor的一个张量
03:39所以我们就通过PL的Image
03:41或NunPy的速度
03:42转换成一个PyTor的张量
03:43然后我们可以自动完成这样一个映射
03:46我们把像度是从0到225映射到0到1
03:49那么就是什么
03:50就是它同时全部除以一个2把数
03:52进行一个强制的缩放
03:54强制一个缩放
03:55那维度呢
03:56我们就变成HWC变成CHW
03:59就是一个PyTor的维度
04:01我们进行一个改变
04:03就像素是维度应该改变
04:05接下来第三步的Normalize
04:06就是一个正则化
04:07正则化
04:08看到吧
04:09正则化
04:11我们这个正则化其实是很简单的
04:13就是X'等于X减掉一个均值
04:16再除以一个标准差
04:17所以看到这个公式
04:19就X'等于X减掉min
04:21然后我们再除以一个STD
04:23看到吧
04:25那么这个就是它的数据
04:27这个一个统计值
04:27对吧
04:28就是min是什么
04:29这一个参数
04:30第一个列表就是min
04:33第二个min列表就是STD
04:35
04:37所以说我们因为在Imaginate上
04:39预行的模型
04:40所以我们必须按照Imaginate上
04:42一个参数
04:42
04:43这个参数进行一个路径设置
04:45这个预处理
04:45
04:46接下来我们再看
04:47接下来呢
04:48我们就设立一个DataLoader了
04:49我们就通过DataSets
04:50模块一个ImaggedFolder
04:52然后我们通过什么
04:54load我们的DataDictionary
04:56DataDictionary就是我们刚定义好的
04:58这个文件数据路径
04:59然后Transform
05:00我们把这个参数传进来
05:01对吧
05:02然后Transize就是我们0.8
05:04然后Ventize就是Lang
05:06FoolDataSets
05:07减掉Transize
05:08那我们就什么意思
05:08就是Transize我们就是
05:11所有数据集的80%
05:12那验证集呢
05:13就是1减到0.8
05:15那多少呢
05:16就0.2呗
05:16那所以我们的训练和验证集
05:19是82开的
05:2182开的
05:22然后我们现在通过RandomSplit
05:23然后进行一个
05:25数据集的拆封
05:28我们来讲一下
05:28它这核心的机制
05:30核心机制叫地规读取
05:32它这个TouchVersion
05:33DataSets Image Folder
05:34它初中就是我们设计这种
05:36什么根目录
05:36类别子文件夹和图片的一个结构
05:39所以说它第一个是Scanning
05:41然后地规的扫描
05:42根目录下所有子文件夹
05:43然后是个Mapping
05:44把子文件夹的名称
05:45提取出来做一个分类名
05:47对吧
05:48最后我们就在Label
05:49进行一个打标
05:52然后这就是一个DataLoader
05:54看到吗
05:54DataLoader
05:54ChainLoader
05:56然后DataLoader
05:57DataLoader呢
05:58我们就是进行一个
05:59使用把我们DataSet
06:01弄进去
06:03然后我们的BatchSize
06:04就是32
06:05每一批词大小
06:06顺略大小
06:06Shuffle是True
06:07这个Shuffle就是False
06:09第一个就是
06:09事情的排列是
06:11Clean是True
06:12然后第二个排列就是False
06:14
06:14接下来就是一个Model的一个初始化
06:16那么我们最近选的
06:17ModelNetSuite
06:19VSuite一个Small
06:20然后Waste等Default
06:22就全中它默认值
06:23它全中也是默认值
06:24
06:26然后接下来就是Classifier
06:27然后我们用个Line
06:28用个线性的
06:29一个特征展开
06:31然后同时呢
06:32它的数据量
06:33它所有的一个类别
06:35所有的类别
06:36进行一个线性展开
06:37然后接下来就是ToshDevice
06:39我们这里
06:39如果你是有True
06:41那么就用True
06:41如果没有True
06:42那么我们就用CPU
06:46然后接下来就是Model2Device
06:48对吧
06:48然后训练设置
06:49我们这样的一个交叉商
06:52交叉商损失
06:53Cross Interplay Loss
06:54进行一个Cretation
06:57进行一个评估
06:57然后我们这样的优化器
06:59一个AdM的优化器
07:01我们设置一个学习力
07:02Learning Rate
07:03是0.001
07:04一般我们都设0.001
07:06
07:06然后把我们的Model
07:07点Parameters
07:08把我们的变量给传进去
07:10然后接下来呢
07:11就是一个训练
07:13一个Early Stopping的一个逻辑
07:15我们假设我们的Patience
07:16是6
07:17Counter是0
07:18然后Best Accuracy
07:19一开始初始的
07:20Best Accuracy
07:21我们初始是0吧
07:22一开始肯定是0啊
07:23对不对
07:24然后后来嘛
07:24也不断的
07:25不断的那个更新
07:27更新更新
07:27我们训练一遍
07:28更新一遍覆盖掉
07:29训练一遍更新一遍覆盖掉
07:31对不对
07:32所以我们就可以打出
07:33这样的一个格式
07:34对不对
07:34我们这样一个表头
07:36Aparch
07:37Loss
07:38Accuracy
07:39OK
07:40然后看
07:42我们知道识别到了
07:43多少的类别输量
07:45类别名称
07:46图片总数
07:47对吧
07:47看到吧
07:48我们这就可以全部打出来了
07:49总共有6类
07:50然后Consultation
07:52然后Google Search
07:54Consumerspace
07:55Google Search
07:56Galaxy
07:57Nubilia
07:58Planets
08:00Stars
08:00对吧
08:01然后我们图片总数
08:021107
08:04
08:04接下来就是我们一个
08:07正式训练的一个代码
08:09这块是最核心
08:10也是最重要的
08:12首先
08:12Aparch
08:13Aparch
08:14我们定义了
08:14自定义了30轮
08:1630轮
08:17定义Aparch
08:18首先我们Model.train
08:20对吧
08:20然后RainingLoss
08:21是0.0
08:22InputsLabels
08:23InTrainLoader
08:24就是我们的输入的数据
08:26还可以打标
08:27对吧
08:27然后我们的InputsToDevice
08:29LabelsToDevice
08:31然后
08:31现在我们首先是设计一个0T度
08:33优化是0T度
08:34然后呢
08:35我们把一个模型
08:36把Inputs放到一个模型里面去
08:38进行Aparch
08:40然后呢
08:40我们通过Credition这个标准
08:42我们刚刚定义的Credition
08:43Credition是什么
08:47那我们的交叉商
08:49损失检验
08:50然后我们有个Credition
08:52然后那个调过来
08:53然后对我们Aparch
08:54Inputs和Labels进行一个Loss
08:56就是损失的一个测量
08:57然后我们把我们损失反向传播
09:00然后我们计算得到的一个真实的东西
09:03我们进前向传播
09:04所以说我们的Loss.backward
09:06然后在UltimateI的.step
09:08就是我们的优化的前向传播
09:10所以呢
09:10这段代码我觉得大家可以背一下
09:13首先就是上来是优化性一个0T度
09:15然后把那个Model
09:16把Inputs传播中
09:17进UltimateI
09:18然后Credition
09:19变成一个Loss
09:20Loss.backward
09:21然后Optinalizer.step
09:23对吧
09:23就是一个
09:24首先是损失的反向传播
09:26然后就是优化的前向传播
09:27然后RainLoss
09:28加上等于一个Loss.item
09:30就是我们进行一个什么
09:31进行一个
09:33所有的那个
09:33就是损失的一个
09:35累加的一个计算
09:36然后到我们的一个逻辑的验证
09:38Model.Evil
09:39我们就是验证
09:40首先我们
09:41初始化设置都是0
09:42这个我们编程都知道的
09:44对吧
09:44你下来初始制先为一个0
09:46然后后面累加嘛
09:47有个累加器
09:48对吧
09:48或累成器
09:49对不对
09:49这个算什么1加到100咯
09:52什么
09:52杨辉三角咯
09:54这种应该是
09:54对吧
09:55这个C元课程
09:56应该是最基础最基础的
09:58大概前半阶期的课程
10:00都会讲到
10:00对吧
10:01然后
10:02首先我们这算是一个T度
10:04T度
10:05没有T度
10:05Touch.noGrade
10:07NoGrade
10:08NoGrade
10:09然后再Inputs
10:10Lables
10:11InvalueLow
10:12输进去
10:13同样的也是这样来一遍
10:15验证
10:16然后这里就是一个Predicted
10:18Touch.max
10:19是吗
10:20OtiposData
10:211
10:21我们这样进行一个验证
10:23就是它到底
10:24OtiposData和1谁大
10:25
10:26然后进行一个判断
10:28然后同样的
10:29我们也是把一个LabelSize
10:30进行一个自增
10:31然后把Correct
10:32然后就是Predicted
10:33等于Lables.sum.item
10:36然后进行一个Correct
10:37就是一个正确率的一个累加
10:39对吧
10:40然后我们的Accuracy
10:41等于100乘以Correct
10:42除以一个Total
10:43对吧
10:44这就是我们的一个
10:46准确率的一个计算
10:49然后这里一个早听了
10:50我就被我修改了
10:52你看
10:52如果轮次大于0
10:54然后它的Accuracy
10:55它小于Last Accuracy
10:56所以我们后一个
10:57小于前一个
10:58那么就是再新增一轮
11:00否则的话
11:01我们就重置
11:02对不对
11:02这轮表现好一上轮
11:03我们就重置计数器
11:05所以我们把Last Accuracy
11:07更新为当前轮的一个准确率
11:12如果它是比那个
11:13历史最佳模型大了
11:14那么把Accuracy
11:16复制给Best Accuracy
11:17然后我们就把这个什么
11:19就代表它是最好的
11:21我们把最好的那什么
11:22要存为模型
11:23看到吧
11:23SaveModel
11:24那么SaveBestSpaceModel.pth
11:27就这个文件
11:29最后打印出来一个
11:32如果Counter
11:32它带于Patience
11:33Patience我们认为六轮
11:34那么就代表出发早停
11:36因为准确率
11:37已经连续六次低于前一轮了
11:39连续Patience次低于前一轮了
11:41那么你去
11:42那么你太多次了
11:44也没必要了
11:44对不对
11:46比如说你连接六次训练的
11:47第一次是0.6
11:48然后训练到第六次
11:50Model变成0.5几了
11:51不停的在减减减减减减减
11:53那么你谁还有必要训练吗
11:54没有必要的吧
11:55那我们就早停
11:56AliceDoping上赶紧结束吧
11:58对吧
11:59这就是我们一个细致的解析
12:01那我们看一下主行解释
12:03Impost to device
12:04把数据放到GPUCP
12:06然后轻空上一次低度
12:07变0T度嘛
12:08前向传播
12:09计算损失
12:10反向传播
12:10更新模型
12:11然后累计损失
12:13对吧
12:13Automizer.0Grad
12:14轻空上一次低度
12:16Outputs等于Model
12:17Impost
12:18就是前向传播
12:19Loss等于Creation
12:20Outputs Labels
12:21计算损失
12:22然后反向传播损失
12:24然后前向更新
12:25模型的一个参数
12:26或前向计算
12:27对吧
12:28然后就是一个累加
12:34这就是一个验证的
12:35差不多的
12:37对我们刚刚讲过
12:38对吧
12:41然后看一下
12:41我们这要出数据数据
12:42最后我们
12:4430轮的时候是0点
12:4663.96%
12:48其实中间有过更好的
12:49但它好像一直上不去了
12:51因为可能
12:51我觉得还是数据集的问题
12:53数据集太少了
12:53就这么点图片
12:54
12:56然后我们看一下
12:57我们的test.py
13:01你看test.py
13:03就是我们知道
13:03就是什么
13:04就是同样的
13:04也是一个
13:05就是我们刚刚是
13:06一个训练的
13:07一个IP1NB
13:08一个Notebook
13:09然后我们知道
13:10就是test.py
13:11就是我们那个测试
13:12对吧
13:13我们同样也是导入相关的
13:15然后还有一个pil
13:16一个图像处理库
13:18导入
13:18touch.device
13:19这个就不用说了
13:21然后六类
13:22class names
13:22对吧
13:23然后导进去
13:24这些都是刚刚的
13:25load state
13:27dict
13:27就是我们刚刚的
13:28这个pth文件
13:30模型文件
13:30对吧
13:32然后接下来就是一个
13:33入数设置
13:33然后predict image
13:35我们就用pil
13:36然后打开图片
13:38然后转换回RGB
13:39三色模式
13:40然后同样就是一个
13:41将量的
13:42transformer image
13:44n-squeeze-0-to-device
13:46然后我们就要增加一个维度
13:48增加一个batch的维度
13:49同样也是那个0T度情况下
13:51然后outputs
13:52然后我们计算一个probialis
13:54然后用softmax
13:55然后维度为1
13:56进行一个计算
13:57它的一个概率最大的类别索引
13:59然后同时呢
14:00我们可以用maxprobialis1
14:02计算一个知性度
14:04和predict的一个idx
14:07同样我们最后进行一个标签
14:09然后return
14:10所有的参数
14:12然后这里呢
14:13就是我们可以替换成
14:14想要测试图片路径
14:15对吧
14:18像我们这里就是这样子
14:19一个图片路径
14:20然后它会检测结果
14:21知性度是怎么样
14:22都会进行一个大印
14:22
14:23然后我们来跑一下试试看
14:25好吧
14:30我们看一下terminal站
14:31能跑出什么样的一个结果
14:39看到吧
14:39conciliation
14:40就是一个检测出来的一个结果
14:43然后我们来回顾一下
14:49我们的核心代码
14:51第一个就是我们的路径设置
14:53与数据处理
14:54对吧
14:55第二个就是我们的模型初始化
14:57怎么样定初始化
14:59第三个就是我们的训练设置
15:01对吧
15:02标准
15:02那个什么
15:03标准
15:04优化器
15:04用adam
15:05对吧
15:05lain rate
15:06怎么设置
15:07然后我们的patience
15:08用来早停控制的
15:09crounter技术器
15:10最佳的那个accuracy
15:13然后就是一个模型训练的一个代码
15:15对吧
15:16这一块是核心中的核心
15:19
15:20然后还有这一块就是一个验证的一个逻辑
15:23这是一个早停的逻辑
15:27这是最后一个保存历史之间模型
15:30然后这是一个模型的调用
15:32模型调用
15:38然后这是我的github
15:39大家可以一起follow一下
15:44
15:44那我们差不多就到这
15:45好了
15:45
15:46不是
15:46不是
15:46还有
15:46全部
15:48
15:48因为
15:48
15:48成病
15:48
15:48
评论

推荐视频