当前位置: 首页 > news >正文

[深度学习]卷积神经网络CNN

1 图像基础知识

import numpy as np
import matplotlib.pyplot as plt
# 图像数据
#img=np.zeros((200,200,3))
img=np.full((200,200,3),255)
# 可视化
plt.imshow(img)
plt.show()
# 图像读取
img=plt.imread('img.jpg')
plt.imshow(img)
plt.show()

2 CNN概述

  • 卷积层conv+relu
  • 池化层pool
  • 全连接层FC/Linear

3 卷积层

 

import matplotlib.pyplot as plt
import torch
from torch import nn
# 数据
img=plt.imread('img.jpg')
print(img.shape)
# conv
img=torch.tensor(img).permute(2,0,1).unsqueeze(0).to(torch.float32)
conv=nn.Conv2d(in_channels=3,out_channels=5,kernel_size=(3,5),stride=(1,2),padding=2)
# 处理
fm=conv(img)
print(fm.shape)

4 池化层

  • 下采样:样本减少
  • 上采样(深采样):样本增多
  • 最大池化相交平均池化使用更多
  • 通常kernel_size=(3,3),stride=(2,2),padding=(自定义)

import torch
from torch import nn
# 创建数据
torch.random.manual_seed(22)
data=torch.randint(0,10,[1,3,3],dtype=torch.float32)
print(data)

# 最大池化
pool=nn.MaxPool2d(kernel_size=(2,2),stride=(1,1),padding=0)
print(pool(data))

# 平均池化
pool=nn.AvgPool2d(kernel_size=(2,2),stride=(1,1),padding=0)
print(pool(data))

5 图像分类案例(LeNet)

import torch
import torch.nn as nn
from torchvision.datasets import CIFAR10
from torchvision.transforms import ToTensor
from torchvision.transforms import Compose
import matplotlib.pyplot as plt
from torchsummary import summary
from torch import optim
from torch.utils.data import DataLoader
# 获取数据
train_dataset=CIFAR10(root='cnn_net',train=True,transform=Compose([ToTensor()]),download=True)
test_dataset=CIFAR10(root='cnn_net',train=False,transform=Compose([ToTensor()]),download=True)
print(train_dataset.class_to_idx)
print(train_dataset.data.shape)
print(test_dataset.data.shape)

plt.imshow(test_dataset.data[100])
plt.show()
print(test_dataset.targets[100])

# 模型构建
class ImageClassification(nn.Module):def __init__(self):super().__init__()self.conv1=nn.Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)self.conv2=nn.Conv2d(in_channels=6,out_channels=16,kernel_size=3,stride=1,padding=0)self.pool1=nn.MaxPool2d(kernel_size=2,stride=2)self.pool2=nn.MaxPool2d(kernel_size=2,stride=2)self.fc1=nn.Linear(in_features=576,out_features=120)self.fc2=nn.Linear(in_features=120,out_features=84)self.out=nn.Linear(in_features=84,out_features=10)def forward(self,x):x=self.pool1(torch.relu(self.conv1(x)))x=self.pool2(torch.relu(self.conv2(x)))x=x.reshape(x.size(0),-1)x=torch.relu(self.fc1(x))x=torch.relu(self.fc2(x))out=self.out(x)return outmodel=ImageClassification()
summary(model,(3,32,32),batch_size=1)
----------------------------------------------------------------Layer (type)               Output Shape         Param #
================================================================Conv2d-1             [1, 6, 30, 30]             168MaxPool2d-2             [1, 6, 15, 15]               0Conv2d-3            [1, 16, 13, 13]             880MaxPool2d-4              [1, 16, 6, 6]               0Linear-5                   [1, 120]          69,240Linear-6                    [1, 84]          10,164Linear-7                    [1, 10]             850
================================================================
Total params: 81,302
Trainable params: 81,302
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.01
Forward/backward pass size (MB): 0.08
Params size (MB): 0.31
Estimated Total Size (MB): 0.40
----------------------------------------------------------------
# 模型训练
optimizer=optim.Adam(model.parameters(),lr=0.0001,betas=[0.9,0.99])
error=nn.CrossEntropyLoss()
epoches=10
for epoch in range(epoches):dataloader=DataLoader(train_dataset,batch_size=2,shuffle=True)loss_sum=0num=0.1for x,y in dataloader:y_=model(x)loss=error(y_,y)loss_sum+=loss.item()num+=1optimizer.zero_grad()loss.backward()optimizer.step()print(loss_sum/num)
# 模型保存
torch.save(model.state_dict(),'model.pth')
# 模型预测
test_dataloader=DataLoader(test_dataset,batch_size=8,shuffle=False)
model.load_state_dict(torch.load('model.pth',weights_only=False))
corr=0
num=0
for x,y in test_dataloader:y_=model(x)out=torch.argmax(y_,dim=-1)corr+=(out==y).sum()num+=len(y)print(corr/num)

优化方向

相关文章:

  • 二分查找详解(Java版)
  • Windows 7 和 Windows 7 sp 的区别
  • 【RocketMQ】SpringBoot整合RocketMQ
  • 《向量数据库指南》——非结构化数据迁徙战:向量数据库的挑战与突破
  • 计算机网络--TCP、UDP抓包分析实验
  • 企业构建AI所需的最低可行基础设施:从数据存储到大模型集成
  • Python线程终止:如何优雅地结束一场“舞蹈”
  • 制造企业为何需要PLM系统?PLM系统解决方案对制造业重要性分析
  • 【Linux的内存管理】
  • 一文让你看懂微服务,服务网格以及Serverless
  • gRPC协议简介
  • Unity 查看Inspectors组件时严重掉帧
  • uni-app+vue3+pina实现全局加载中效果,自定义全局变量和函数可供所有页面使用
  • Python 面向对象编程基础
  • CSR、SSR、SSG
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • @jsonView过滤属性
  • [译] 怎样写一个基础的编译器
  • 08.Android之View事件问题
  • 0基础学习移动端适配
  • avalon2.2的VM生成过程
  • create-react-app项目添加less配置
  • CSS 专业技巧
  • express如何解决request entity too large问题
  • iOS编译提示和导航提示
  • October CMS - 快速入门 9 Images And Galleries
  • Python3爬取英雄联盟英雄皮肤大图
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 聊聊flink的BlobWriter
  • 漂亮刷新控件-iOS
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信支付JSAPI,实测!终极方案
  • 温故知新之javascript面向对象
  • ionic入门之数据绑定显示-1
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #、%和$符号在OGNL表达式中经常出现
  • (11)(2.1.2) DShot ESCs(四)
  • (C#)获取字符编码的类
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (Qt) 默认QtWidget应用包含什么?
  • (黑马C++)L06 重载与继承
  • (六)Flink 窗口计算
  • (四) Graphivz 颜色选择
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转)为C# Windows服务添加安装程序
  • ./和../以及/和~之间的区别
  • .Net 8.0 新的变化
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net7 环境安装配置
  • .Net插件开发开源框架