最新要闻
- 今日要闻!验证码被攻破!谷歌AI已能精准识别 GPT-4则装瞎求人帮忙
- 美女博主在家拍擦边视频?穿瑜伽服涨粉百万!真相是...
- 全球今头条!3DMark加入AMD FSR专项测试:终于追上NVIDIA、Intel
- 全球报道:广汽埃安AION Y Plus 2023款上市:14万级唯一纯电610KM续航
- 天天信息:V观财报|科达制造股东广东联塑短线交易致歉
- 世界信息:5.98万起售还嫌贵?五菱缤果上市即热销:当天交付522台
- 每日热议!想买车的抓紧 广州新能源汽车也有补贴了:最高1万元
- 世界微头条丨《原神》开发商新作:米哈游《崩坏:星穹铁道》预约超2000万
- 环球热推荐:米香四溢:袁隆平品牌隆平农场东北晶米10斤39.9元发车
- 华硕ROG游戏手机7真机曝光:无挖孔全面屏、后置三摄
- 天天讯息:华天科技2022年营收119亿元 拟实施先进封测研发及产业化项目
- 观点:确认引进内地!《小美人鱼》新泄露镜头:爱丽儿深情抚摸王子的脸
- 全球首个商用海底数据中心在海南下水:算力高、散热不费电
- 今日关注:不挑路面、转得很稳 仰望U8如何实现原地掉头?官方详解
- 大学生应聘饭店洗碗工被HR婉拒 HR:第一份工作很重要 这会害了他
- 不等发布会!vivo X Fold2真机抢先看:素皮+玻璃设计惊艳
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
全球时讯:深度学习——用简单的线性模型构建识别鸟与飞机模型
本文仅为深度学习的入门学习,故采用线性模型而非CNN处理图像数据集。
一、准备工作
1. 下载CIFAR-10数据集
这是一个\(32\times32\)像素的RGB图像集合,用于学习使用。
from torchvision import datasetsdata_path = "./data/"cifar10 = datasets.CIFAR10(root=data_path, train=True, download=False) # 下载训练集cifar10_val = datasets.CIFAR10( root=data_path, train=False, download=False) # 下载验证集
数据集共有10个类别,用一个整数对应10个级别中的一个:
(资料图片)
class_names = {0: "飞机", 1: "汽车", 2: "鸟", 3: "猫", 4: "鹿", 5: "狗", 6: "青蛙", 7: "马", 8: "船", 9: "卡车"}
查看数据集的父类,注意Dataset
类,后面会提到!
type(cifar10).__mro__
(torchvision.datasets.cifar.CIFAR10, torchvision.datasets.vision.VisionDataset, torch.utils.data.dataset.Dataset, typing.Generic, object)
2. Dataset类
Dataset
类中实现了2种函数的对象:__len__()
和__getitem__()
,前者返回数据项的总数,后者返回样本和与之对应的整数索引。
len(cifar10)
50000
img, label = cifar10[111]img, label, class_names[label]
(, 8, "船")
import matplotlib.pyplot as pltplt.imshow(img)plt.show()
3. Dataset变换
在transform
中提供了ToTensor
对象,它将Numpy
数组和PIL
图像变换为张量。并将输出张量的尺寸设置为:\(C\times H\times W\)(分别代表通道、高度和宽度)
from torchvision import transformsto_tensor = transforms.ToTensor()img_t = to_tensor(img)img_t.shape
torch.Size([3, 32, 32])
图像已经转变为 \(3\times 32\times 32\)的张量。但是,它的标签并不会改变。
回到第一步,在数据集加载时,可以将ToTensor()
作为一个参数
tensor_cifar10 = datasets.CIFAR10( data_path, train=True, download=False, transform=transforms.ToTensor())
此时,访问数据集的元素将返回一个张量,而不是PIL图像
img_t, _ = tensor_cifar10[111]type(img_t)
torch.Tensor
img_t.shape, img_t.dtype
(torch.Size([3, 32, 32]), torch.float32)
原始PIL图像,中的值0-255(每个通道8位),而ToTensor
变换将数据变换为每个通道32位浮点数,将值缩小为0.0~1.0
img_t.min(), img_t.max()
(tensor(0.0588), tensor(0.8039))
验证下图片是否一致,在这之前需要更改下通道以符合matplotlib
的期望,将\(C\times H \times W\)改为\(H\times W \times C\)
plt.imshow(img_t.permute(1, 2, 0))plt.show()
4. 数据归一化
由于CIFAR-10
数据集较小,可将数据集返回的所有张量并沿着一个额外的维度进行堆叠
import torchimgs = torch.stack([img_t for img_t, _ in tensor_cifar10], dim=3)imgs.shape
torch.Size([3, 32, 32, 50000])
view(3, -1)
保留了3个通道,并将剩余的维度合并为一个维度,从而计算适当的尺寸大小。这里\(3\times 32\times32\)图像被转换了\(3\times 1024\)的向量,然后对每个通道的1024个向量求平均值
imgs.view(3, -1).mean(dim=1)
tensor([0.4914, 0.4822, 0.4465])
同理,计算标准差
imgs.view(3, -1).std(dim=1)
tensor([0.2470, 0.2435, 0.2616])
现在可进行Normalize变换了
transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2470, 0.2435, 0.2616))
Normalize(mean=(0.4914, 0.4822, 0.4465), std=(0.247, 0.2435, 0.2616))
再次更改第3步中的tensor_cifar10
:
transformed_cifar10 = datasets.CIFAR10( data_path, train=True, download=False, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2470, 0.2435, 0.2616)) ]))
重新调整下维度,显示图片
img_t, _ = transformed_cifar10[111]plt.imshow(img_t.permute(1, 2, 0))plt.show()
Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).
可见颜色与原来不同,这是因为归一化对RGB超出0.0-1.0的数据进行了转化,并调整了通道的总体大小,数据存在,但matplotlib渲染不同。
二、区分鸟与飞机
1. 构建数据集
label_map = {0: 0, 2: 1}class_names = ["airplane", "bird"]cifar2 = [(img, label_map[label]) for img, label in cifar10 if label in [0, 2]]cifar2_val = [(img, label_map[label]) for img, label in cifar10_val if label in [0, 2]]
构建一个线性模型
import torch.nn as nnn_out = 2model = nn.Sequential( nn.Linear( 3072, # 输入特征 512, # 隐藏层大小 ), nn.Tanh(), nn.Linear( 512, # 隐藏层大小 n_out, # 输出类 ))
3. 用概率表示输出
softmax函数,获取一个向量并生成另一个相同维度的向量,表达式如下所示:
\[Softmax(x_i)=\frac{e^{x_i}}{\sum_j e^{x_j}}\]def softmax(x): return torch.exp(x) / torch.exp(x).sum()x = torch.tensor([1.0, 2.0, 3.0])softmax(x)
tensor([0.0900, 0.2447, 0.6652])
它满足概率的约束条件,即各个概率相加为1
softmax(x).sum()
tensor(1.)
当然,nn模块将Softmax作为一个可用模块。在使用时,要求指定用来编码概率的维度。
softmax = nn.Softmax(dim=1)x = torch.tensor([[1., 2., 3.], [1., 2., 3.]])softmax(x)
tensor([[0.0900, 0.2447, 0.6652], [0.0900, 0.2447, 0.6652]])
在建立模型时,添加softmax函数,这样网络便可产生概率。
model = nn.Sequential( nn.Linear(3072, 512), nn.Tanh(), nn.Linear(512, 2), nn.Softmax(dim=1))
在正式训练模型前,尝试运行下,看看结果
img, _ = cifar2[0]img_t = to_tensor(img)plt.imshow(img_t.permute(1, 2, 0))plt.show()
在使用模型时需要输入正确的维度。在输入中,期望是3072个特征,而nn处理的是沿着第0维成批组织的数据。因此我们需要将\(3\times 32\times 32\)图像变量一个一维张量。
img_batch = img_t.view(-1).unsqueeze(0)
out = model(img_batch)out
tensor([[0.4620, 0.5380]], grad_fn=)
再通过torch.max()
返回该维度上最大元素以及该值出现的索引。在这里,我们需要沿着概率向量取最大值,因此维度为1:
_, index = torch.max(out, dim=1)index
tensor([1])
虽然完全没有训练,但是意外的猜中了。
3. 分类的损失
分类损失可以按以下步骤计算:
- 运行正向传播,并从最后的线性层获取输入值。
- 计算它们的Softmax以获取概率。
- 取与目标类别对应的预测概率(参数的可能性)。在有监督学习中,我们当然知道它的类别。
- 计算它的对数的相反数(LogSoftmax函数)再添加到损失中。
现在修改模型,使用nn.LogSoftmax()
作为输出模块:
model = nn.Sequential( nn.Linear(3072, 512), nn.Tanh(), nn.Linear(512, 2), nn.LogSoftmax(dim=1))
实例化NLL损失(负对数似然,Negative Log Likelihood)
loss = nn.NLLLoss()
损失将批次的nn.LogSoftmax()的输出作为第1个参数,将索引的张量(例子中的0和1)作为第2个参数
img, label = cifar2[0]img_t = to_tensor(img)out = model(img_t.view(-1).unsqueeze(0))loss(out, torch.tensor([label]))
tensor(0.6234, grad_fn=)
4. 训练分类器
训练数据时,加入工具类中的DataLoader
,该类有助于打乱数据和组织数据。数据加载器的工作是从数据集中采样小批量,期间可以选择不同的采样策略,在这里,是在每个迭代周期洗牌后进行均匀采样。
import torchimport torch.nn as nnfrom torch import optimfrom torch.utils.data import DataLoadercifar2_ = []to_tensor = transforms.ToTensor()for img, label in cifar2: cifar2_.append((to_tensor(img), label),)# pin_memory=True 表示启用GPU加速,num_workers=4 表示使用4个子进程来加速数据加载train_loader = DataLoader(cifar2_, batch_size=64, pin_memory=True, shuffle=True, num_workers=4, drop_last=True)model = nn.Sequential( # 建立模型 nn.Linear(3072, 512), nn.Tanh(), nn.Linear(512, 2), nn.LogSoftmax(dim=1))learning_rate = 1e-2 # 学习率optimizer = optim.SGD(model.parameters(), lr=learning_rate) # 使用随机梯度下降的优化器loss_fn = nn.NLLLoss()n_epochs = 100for epoch in range(n_epochs): for i, (imgs, labels) in enumerate(train_loader): batch_size = imgs.shape[0] out = model(imgs.view(batch_size, -1)) loss = loss_fn(out, labels) optimizer.zero_grad() loss.backward() optimizer.step() print("Epoch: %d, Loss: %f" % (epoch, float(loss)))
Epoch: 0, Loss: 0.467450Epoch: 1, Loss: 0.442974Epoch: 2, Loss: 0.489499Epoch: 3, Loss: 0.501898Epoch: 4, Loss: 0.460788...Epoch: 95, Loss: 0.246432Epoch: 96, Loss: 0.342604Epoch: 97, Loss: 0.408567Epoch: 98, Loss: 0.384299Epoch: 99, Loss: 0.244038
保存模型
path = "./models/birdOrPlane.pth"torch.save(model, path)
现在,我们在独立的数据集上做测试
cifar2_val_ = []to_tensor = transforms.ToTensor()for img, label in cifar2_val: cifar2_val_.append((to_tensor(img), label),)val_loader = DataLoader(cifar2_val_, batch_size=64, pin_memory=True, shuffle=False, num_workers=4, drop_last=True)correct = 0total = 0with torch.no_grad(): # 现在只关心结果,不许需要计算梯度 for imgs, labels in val_loader: batch_size = imgs.shape[0] outputs = model(imgs.view(batch_size, -1)) _, predicted = torch.max(outputs, dim=1) total += labels.shape[0] correct += int((predicted == labels).sum()) print("Accuracy: %f"%(correct / total))
Accuracy: 0.832661
可以看见,训练后的模型准确率还是比较可观的。
三、总结
在本次模型的构建和训练中,我们将二维图片当作一维来处理,这也直接导致了模型的参数巨多!
线性层的计算公式:\(y=w\times x+b\),\(x\)的长度为\(3072\)(\(3\times32\times32\)),\(y\)的长度为\(1024\),可知\(w\)的大小为\(1024\times3072\),\(b\)的长度为\(1024\),因此参数大小为\(1024\times3072+1024=3,146,752\)
试想,如果是更大的图片,参数的数量恐怕会增加地更离谱!
因此,对于图像,需要学习利用图像数据的二维特征来获取更好的结果!
参考文献
[1]Eli Stevens. Deep Learning with Pytorch[M]. 1. 人民邮电出版社, 2022.02 :144-163.
关键词:
-
Redhat/CentOS Linux 系统进入单用户模式
Redhat CentOSLinux系统进入单用户模式以CentOS7 9和Redhat8 2为例进行操作,因为CentOS是Redhat的发...
来源: 全球时讯:深度学习——用简单的线性模型构建识别鸟与飞机模型
Redhat/CentOS Linux 系统进入单用户模式
天天即时看!万恶的环境 二 java
今日要闻!验证码被攻破!谷歌AI已能精准识别 GPT-4则装瞎求人帮忙
美女博主在家拍擦边视频?穿瑜伽服涨粉百万!真相是...
全球今头条!3DMark加入AMD FSR专项测试:终于追上NVIDIA、Intel
全球报道:广汽埃安AION Y Plus 2023款上市:14万级唯一纯电610KM续航
天天信息:V观财报|科达制造股东广东联塑短线交易致歉
世界消息!Teamcenter_SOA开发:使用查询构建器查询数据
即时:flatMap
热讯:React Native 备忘清单_开发速查表分享
世界信息:5.98万起售还嫌贵?五菱缤果上市即热销:当天交付522台
每日热议!想买车的抓紧 广州新能源汽车也有补贴了:最高1万元
世界微头条丨《原神》开发商新作:米哈游《崩坏:星穹铁道》预约超2000万
环球热推荐:米香四溢:袁隆平品牌隆平农场东北晶米10斤39.9元发车
华硕ROG游戏手机7真机曝光:无挖孔全面屏、后置三摄
天天讯息:华天科技2022年营收119亿元 拟实施先进封测研发及产业化项目
当前焦点!Leetcode Practice --- 栈和队列
我的第一个项目(七):(解决问题)Vue中canvas无法绘制图片
观点:确认引进内地!《小美人鱼》新泄露镜头:爱丽儿深情抚摸王子的脸
全球首个商用海底数据中心在海南下水:算力高、散热不费电
今日关注:不挑路面、转得很稳 仰望U8如何实现原地掉头?官方详解
大学生应聘饭店洗碗工被HR婉拒 HR:第一份工作很重要 这会害了他
不等发布会!vivo X Fold2真机抢先看:素皮+玻璃设计惊艳
现场丨圆桌对话:抓住确定性——楼宇经济的大周期和小趋势
讯息:awk 处理 Git 提交信息生成 Release Note
最长上升子序列 II
视焦点讯!day3 函数的定义和调用,练习编写简单的程序(记录1)
天天热文:内存/SSD白菜价甩卖 美光芯片大减产:工厂停机率创纪录
任泽平:在中国做生意没任何理由抱怨 燃油车正迎来诺基亚时刻
世界新资讯:宏碁推出W系列4K电视:QLED面板、30W扬声器
油价“二连降” 今年来最大降幅!加满一箱油少花13元
【全球热闻】网络时钟同步设备(NTP时间同步服务器)技术设计应用方案
全球实时:记录--你可能忽略的10种JavaScript快乐写法
聚焦:无所畏惧的求和题解
今亮点!商品日报(3月31日):焦炭低位反弹菜油补涨 纸浆、玻璃主力合约跌超2%
保姆级教程!12306官方详解“免费坐高铁”
环球速递!RTX 40系显卡才能“撑得住”!《赛博朋克2077》实现路径光追
夏季必备 圈叉潮品纯棉印花T恤/短裤24.9元起
【新视野】编程神童立志写最棒的程序改变世界 严重偏科只能选职高 妈妈无奈
世界视讯!成龙自豪发声:不是我要去好莱坞 而是好莱坞要我
“19鑫苑01”到期日期将延期一年
Excel批量检查5列数据是否一致(存在不规则空值)
【密码管理器】上海道宁为您提供存储和使用强密码的简单方法工具软件——1Password
【环球报资讯】MQTT协议介绍
世界热资讯!开心档之Go 语言环境安装
DIM中的一些知识点(慢更)
新消息丨每日机构分析:3月31日
全球实时:国家发展改革委:国内汽、柴油价格每吨分别降低335元和320元
焦点简讯:吃日料、听京剧 库克时隔3年再访中国:6年前还去过ofo小黄车总部
全球观焦点:酷派新品发布会定档4月3日:三款新机待发
世界聚焦:2023增长最快的手机品牌!一加Ace 2首销日销量在第三方平台遥遥领先
天天观察:B站弹幕射击《爆裂魔女》5月30日停运 共运营592天
任天堂Switch 2不会远了!开发者已收到新主机开发工具
世界信息:周日阳光可期抓紧洗晒 下周四冷空气再袭降水将达到中雨
每日快讯!卸载SQL Server 2012图文教程
环球报道:你还在手写 join 联表查询?MyBatis-Plus 这样写太香了!
天天新动态:Python 数字类型之 int float
每日观点:收评:两市红盘震荡创指涨0.69% 人工智能板块涨幅居前
世界百事通!比亚迪F品牌再曝谍照 主攻40-60万市场/下半年预售
天天资讯:38岁985文科硕士被迫送外卖!本人再发声:已脱下孔乙己长衫 应聘道士被拒
云南一县城禁止“脏车入城”:有明显污迹、车轮粘泥不许在城区行驶
百元就能畅享8K 流畅清爽无广告!当贝盒子H3视频评测
当前快讯:刘浩存在新片《龙马精神》首映礼上哭了:感谢成龙带自己拍戏
环球今头条!GPT-4被指威胁公共安全!OpenAI遭第三方组织投诉
基于Go/Grpc/kubernetes/Istio开发微服务的最佳实践尝试 - 2/3
【焦点热闻】如何实现根据环境切换不同配置?
数据丢失不用怕,火山引擎 DataLeap 提供排查解决方案
英特尔以强大产品力,迎接生成式AI的广阔机遇
【全球快播报】北京启动存量住房交易“带押过户”模式
热消息:直播间卖卫星 最低200万!罗永浩:真的 把卫星价格打下来
Redmi Note 12 Turbo晒战绩:16GB+1TB开售5分钟超过全行业历史销量之和
每日热闻!这就离谱!A7S3传感器用来拍Vlog 索尼ZV-E1开启预售
vivo X Fold2影像曝光:IMX866主摄、潜望长焦取消
天天实时:一键获取测试脚本,轻松验证“TSBS 时序数据库性能基准测试报告”
天天快看点丨windows系统 批量处理文件名称
Python Django投稿系统代码
环球今头条!日本最早将于2024年度在新东名高速公路部分区间设置自动驾驶车道
环球即时看!小姐姐秒种草!雅迪冠能摩登发布:独创复古女王风
当前速讯:你家乡上榜没?中国省级“癌症地图”出炉:肺癌列第一 “穷癌”下降“富癌”上升
3299元性价比封神!AMD Zen4 104MB缓存锐龙7 7800X3D价格公布
迅雷临时文件读取错误怎么回事?迅雷临时文件读取错误怎么解决?
色带打印机怎么换色带?色带的正确安装方法是什么?
win10版本号与操作系统版本号有什么区别?怎么查看win10版本号?
英雄联盟狮子狗叫什么?英雄联盟狮子狗连招介绍
诺基亚X3上市时间是什么时候?诺基亚X3手机参数
CloudCanal 落地 DB2 数据迁移同步功能
观天下!hdfs disk balancer 磁盘均衡器
全球百事通!Python 应用 - jieba 分词 1:进行批量文本分词_艽野尘梦 better 的博客 - CSDN 博客
全球滚动:数论分块简介
【速看料】Mysql之SQL语句基础1
环球快报:2磅蛋糕是几寸适合多少人吃_2磅蛋糕是几寸
新消息丨贾跃亭宣布历史时刻:为梦想窒息FF 91量产!老外狠拆台展示车架或未全面投产
Windows 11 2024版发布了!首个官方ISO镜像免费下载
环球观点:调查显示:超半数受访者认为学历还是敲门砖
环球今热点:男子将父亲骨灰撒入大海被抓?为啥不能私自撒?
全球消息!庆祝索尼第一方游戏登陆XGP:微软推出Xbox限定主机
交互触摸大屏概念整理
速讯:全网最全的权限系统设计方案,不接受反驳!
要闻速递:[Redis]Redis概述