basic CNN

文章目录

  • 回顾
  • 卷积神经网络
    • 卷积
    • 卷积核
    • 卷积过程
    • 卷积后图像尺寸计算公式:
      • 代码
    • padding
      • 代码
    • Stride
      • 代码
    • MaxPooling
      • 代码
  • 一个简单的卷积神经网络
    • 用卷积神经网络来对MINIST数据集进行分类
    • 如何使用GPU
    • 代码
  • 练习

回顾

下面这种由线形层构成的网络是全连接网络。
在这里插入图片描述
对于图像数据而言,卷积神经网络更常用。

卷积神经网络

通过二维卷积可以实现图像特征的自动提取,卷积输出的称为特征图;特征提取之后可以通过全连接层构造分类器进行分类。

  • 特征提取
    • 卷积
    • 池化
  • 分类
    • 展开
    • 全连接
      在这里插入图片描述
      在卷积神经网络里面,我们会把输入图片划分成一个个的小格子(cell)
      在这里插入图片描述

卷积

图像中不同数据窗口的数据和卷积核作内积的操作叫做卷积,本质是提取图像不同频段的特征。和图像处理中的高斯模糊核原理一样。

在这里插入图片描述

卷积核

  • 带着一组固定权重的神经元,可以用来提取特定的特征(例如可以提取物体轮廓、颜色深浅等)
  • 卷积核大小:3x3,5x5,7x7
  • 卷积核的通道数与被卷积的图片通道数相同

卷积过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输入为3通道的卷积计算过程如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
n通道输入的卷积:
在这里插入图片描述
如果想要输出通道为M,则需要M个卷积核:
在这里插入图片描述
注意:卷积核的通道要求和输入通道一样;卷积核的个数要求和输出通道数一样。

卷积后图像尺寸计算公式:

在这里插入图片描述

代码

import torch
in_channels,out_channels=5,10
width,height=100,100
kernel_size=3
batch_size=1input = torch.randn(batch_size,in_channels,width,height)#生成0-1正态分布
conv_layer=torch.nn.Conv2d(in_channels,out_channels,kernel_size=kernel_size)
output=conv_layer(input)print(input.shape)
print(output.shape)
print(conv_layer.weight.shape)

结果:

torch.Size([1, 5, 100, 100])
torch.Size([1, 10, 98, 98])
torch.Size([10, 5, 3, 3])

padding

进行卷积之后,图像大小(W、H)可能会发生改变;生成的特征图大小不是我们想要的,比如说我们希望特征图大小在卷积之后不发生变化;那么可以使用padding在输入图像像素周围进行填充,padding=1就是填充一圈0.
在这里插入图片描述
在这里插入图片描述

代码

import torch
in_channels,out_channels=5,10
width,height=100,100
kernel_size=3
batch_size=1
input=[3,4,6,5,7,2,4,6,8,2,1,6,7,8,4,9,7,4,6,2,3,7,5,4,1]
input=torch.Tensor(input).view(1,1,5,5)
conv_layer=torch.nn.Conv2d(1,1,kernel_size=3,padding=1,bias=False)#paddings=1(扩充一圈)相当于扩充原来矩阵维数,比如4*4,变成5*5
kernel=torch.Tensor([1,2,3,4,5,6,7,8,9]).view(1,1,3,3)
conv_layer.weight.data=kernel.data
output=conv_layer(input)print(output)

结果:

ensor([[[[ 91., 168., 224., 215., 127.],[114., 211., 295., 262., 149.],[192., 259., 282., 214., 122.],[194., 251., 253., 169.,  86.],[ 96., 112., 110.,  68.,  31.]]]], grad_fn=<ConvolutionBackward0>)

Stride

Stride:步长。卷积核每次移动的cell距离

  • Stride=1:每次移动一格
  • Stride=2:每次移动两格
    在这里插入图片描述
    在这里插入图片描述

代码

import torch
in_channels,out_channels=5,10
width,height=100,100
kernel_size=3
batch_size=1
input=[3,4,6,5,7,2,4,6,8,2,1,6,7,8,4,9,7,4,6,2,3,7,5,4,1]
input=torch.Tensor(input).view(1,1,5,5)
conv_layer=torch.nn.Conv2d(1,1,kernel_size=3,stride=2,bias=False)#stride=2
kernel=torch.Tensor([1,2,3,4,5,6,7,8,9]).view(1,1,3,3)
conv_layer.weight.data=kernel.data
output=conv_layer(input)
print(output)

结果:

tensor([[[[211., 262.],[251., 169.]]]], grad_fn=<ConvolutionBackward0>)

MaxPooling

MaxPooling:下采样,图片W、H会缩小为原来的一半。(默认情况下,kernel=2,stride=2)

代码

import torch
in_channels,out_channels=5,10
width,height=100,100
kernel_size=3
batch_size=1
input1 = [3,4,6,5,2,4,6,8,1,6,7,8,9,7,4,6,]input1 = torch.Tensor(input1).view(1, 1, 4, 4)
maxpooling_layer=torch.nn.MaxPool2d(kernel_size=2)#默认kernei_size=2
output1=maxpooling_layer(input1)
print(output1)

结果:

tensor([[[[4., 8.],[9., 8.]]]])

一个简单的卷积神经网络

用卷积神经网络来对MINIST数据集进行分类

在这里插入图片描述
在这里插入图片描述
模型部分代码:

class Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.conv1=torch.nn.Conv2d(1,10,kernel_size=5)self.conv2=torch.nn.Conv2d(10,20,kernel_size=5)self.pooling=torch.nn.MaxPool2d(2)self.fc=torch.nn.Linear(320,10)def forward(self,x):# Flatten data from (n, 1, 28, 28) to (n, 784)batch_size=x.size(0)x=F.relu(self.pooling(self.conv1(x)))x=F.relu(self.pooling(self.conv2(x)))x=x.view(batch_size,-1)#flattenx=self.fc(x)return xmodel=Net()

在之前的代码里改一下模型部分就可以了。
请自己尝试改一下,并且输出loss曲线!

如何使用GPU

  1. 定义devicedevice = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  2. 将所有模型的parameters and buffers转化为CUDA Tensor.model.to(device)
  3. 将数据送到GPU上inputs,target=inputs.to(device),target.to(device)

代码

import numpy as np
import torch
import matplotlib.pyplot as plt
from torch.utils.data import DataLoader #For constructing DataLoader
from torchvision import transforms #For constructing DataLoader
from torchvision import datasets #For constructing DataLoader
import torch.nn.functional as F #For using function relu()batch_size=64
transform=transforms.Compose([transforms.ToTensor(),#Convert the PIL Image to Tensor.transforms.Normalize((0.1307,),(0.3081,))])#The parameters are mean and std respectively.train_dataset = datasets.MNIST(root='dataset',train=True,transform=transform,download=True)
test_dataset = datasets.MNIST(root='dataset',train=False,transform=transform,download=True)
train_loader = DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True)
test_loader = DataLoader(dataset=test_dataset,batch_size=batch_size,shuffle=False)class Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.conv1=torch.nn.Conv2d(1,10,kernel_size=5)self.conv2=torch.nn.Conv2d(10,20,kernel_size=5)self.pooling=torch.nn.MaxPool2d(2)self.fc=torch.nn.Linear(320,10)def forward(self,x):# Flatten data from (n, 1, 28, 28) to (n, 784)batch_size=x.size(0)x=F.relu(self.pooling(self.conv1(x)))x=F.relu(self.pooling(self.conv2(x)))x=x.view(batch_size,-1)#flattenx=self.fc(x)return xmodel=Net()#device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
#定义device,如果有GPU就用GPU,否则用CPU#model.to(device)
# 将所有模型的parameters and buffers转化为CUDA Tensor.criterion=torch.nn.CrossEntropyLoss()
optimizer=torch.optim.SGD(model.parameters(),lr=0.01,momentum=0.5)
def train(epoch):running_loss=0.0for batch_id,data in enumerate(train_loader,0):inputs,target=data#inputs,target=inputs.to(device),target.to(device)#将数据送到GPU上optimizer.zero_grad()# forward + backward + updateoutputs=model(inputs)loss=criterion(outputs,target)loss.backward()optimizer.step()running_loss +=loss.item()if batch_id% 300==299:print('[%d,%5d] loss: %.3f' % (epoch+1,batch_id,running_loss/300))running_loss=0.0accracy = []
def test():correct=0total=0with torch.no_grad():for data in test_loader:inputs,target=data#inputs,target=inputs.to(device),target.to(device)#将数据送到GPU上outputs=model(inputs)predicted=torch.argmax(outputs.data,dim=1)total+=target.size(0)correct+=(predicted==target).sum().item()print('Accuracy on test set : %d %% [%d/%d]'%(100*correct/total,correct,total))accracy.append([100*correct/total])if __name__ == '__main__':for epoch in range(10):train(epoch)test()x=np.arange(10)plt.plot(x, accracy)plt.xlabel("Epoch")plt.ylabel("Accuracy")plt.grid()plt.show()

训练结果:
在这里插入图片描述
如果使用了GPU,可以查看GPU利用率,被占用就说明跑起来了在这里插入图片描述

练习

使用MINIST数据集构建更为复杂的卷积神经网络进行分类,要求conv、relu、maxpooling、linear层都使用三个,参数自己调整,比较一下训练结果。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/659138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分治 (地毯填补问题)

地毯填补问题 题目描述 相传在一个古老的阿拉伯国家里&#xff0c;有一座宫殿。宫殿里有个四四方方的格子迷宫&#xff0c;国王选择驸马的方法非常特殊&#xff0c;也非常简单&#xff1a;公主就站在其中一个方格子上&#xff0c;只要谁能用地毯将除公主站立的地方外的所有地…

万户 ezOFFICE DocumentEdit_unite.jsp SQL注入漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

Python下载安装与环境配置

本文将指导您完成Python的下载、安装以及环境配置过程&#xff0c;确保您在编写和运行Python代码时能够获得最佳体验。我们将提供详细的步骤和代码示例&#xff0c;帮助您顺利完成设置。 一、Python下载与安装 访问Python官网&#xff1a;首先&#xff0c;您需要访问Python的官…

Pycharm 关闭/退出烦人的Pytest模式

Pycharm 遇到&#xff1a;Run Python tests in ***.py &#xff0c;但很多时候我们并不需要&#xff0c;真心烦人&#xff01; 如何解决: 1 打开File-Settings &#xff08;图片是新版界面&#xff0c;旧版同样操作&#xff09; 2 Tools 中的Python Integrated Tools 在Tes…

LeetCode —— 137. 只出现一次的数字 II

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

第17次修改了可删除可持久保存的前端html备忘录:增加年月日星期,增加倒计时,更改保存区名称可以多个备忘录保存不一样的信息,匹配背景主题:现代深色

第17次修改了可删除可持久保存的前端html备忘录&#xff1a;增加年月日星期&#xff0c;增加倒计时&#xff0c;更改保存区名称可以多个备忘录保存不一样的信息&#xff0c;匹配背景主题&#xff1a;现代深色 备忘录代码&#xff1a; <!DOCTYPE html> <html lang&quo…

“死“社群先不要扔,想办法激活一下,隔壁的运营都馋哭了

私域运营已成为当下很多企业寻求增长的标配。在这过程中&#xff0c;社群运营就是极为重要的一个环节。过去我们为了流量&#xff0c;疯狂建群拉人。但建社群容易活跃难&#xff0c;活跃一段时间后&#xff0c;社群会越来越安静。 不仅如此&#xff0c;群主和管理员也渐渐疏于…

c++ 字符串切分split

c 字符串切分split 的举例实现 一共给出了四种方式 1、 strtok 2、 stringstream 3、 字符串查找 4、 基于封装的方式&#xff0c;提供了 c11 foreach 接口 代码 vector<string> split(string s) {vector<string> res;const char *p strtok((char *) s.c_str(),…

hbuilderx uniapp运行到真机控制台显示手机端调试基座版本号1.0.0,调用uni.share提示打包时未添加share模块

记录一个困扰了几天的一个蠢问题&#xff0c;发现真相的我又气又笑。 由于刚开始接触uniapp 移动端开发&#xff0c;有个需求需要使用uni.share API&#xff0c;但是我运行项目老提示打包时没配置share模块 我确实没在manifest内配置。网上搜了一些资料&#xff0c;但是我看官…

在Excel把两个单元格的内容,合并后显示在第三个单元格

在Excel中&#xff0c;将两个单元格的内容合并显示到第三个单元格有几种方法&#xff1a; 1. 使用 CONCATENATE 函数&#xff08;在较早版本的 Excel 中&#xff09;&#xff1a; 在目标单元格&#xff08;例如 C1&#xff09;中输入以下公式&#xff1a; CONCATENATE(A…

比Filebeat更强大的日志收集工具-Fluent bit的http插件实战

文章目录 1.前言2. fluent bit http插件配置以及参数详解3. Http 接口服务3.1 开发Http 接口服务3.2 重启fluent bit向http web服务发送数据 1.前言 Fluent Bit 的 HTTP 插件提供了一种灵活而通用的机制&#xff0c;可用于将日志数据 从各种环境中传输到指定的远程服务器&#…

EDR、SIEM、SOAR 和 XDR 的区别

在一个名为网络安全谷的神秘小镇&#xff0c;居住着四位守护者&#xff0c;他们分别是EDR&#xff08;艾迪&#xff09;、SIEM&#xff08;西姆&#xff09;、SOAR&#xff08;索亚&#xff09;和XDR&#xff08;艾克斯&#xff09;。他们各自拥有独特的能力&#xff0c;共同守…

力扣hot100 电话号码的字母组合 回溯

Problem: 17. 电话号码的字母组合 文章目录 思路复杂度&#x1f49d; Code 思路 &#x1f468;‍&#x1f3eb; 参考题解 复杂度 时间复杂度: O ( 3 8 ) O(3^8) O(38) 空间复杂度: O ( 3 8 ) O(3^8) O(38) &#x1f49d; Code class Solution {String[] map { "…

Redis 实际项目中的整合,记录各种用法

Redis缓存餐厅数据 我们来看主要的流程 很简单,就是在数据库和接口之间加了一层缓冲,在redis之前其实还可以加其他的缓存 例如 nginx的缓存 接下来,就是结合我的业务,来做缓存 我这里的业务逻辑是,按了分类的按钮,分别以不同的 分类为一组缓存数据 所以,这里的缓存粒度是分类…

【JS逆向实战-入门篇】某gov网站加密参数分析与Python算法还原

文章目录 1. 写在前面2. 请求分析3. 断点分析4. 算法还原 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向感兴趣的朋…

java中Ajax与Axios的使用

1&#xff0c;Ajax 1.1 概述 AJAX (Asynchronous JavaScript And XML)&#xff1a;异步的 JavaScript 和 XML。 我们先来说概念中的 JavaScript 和 XML&#xff0c;JavaScript 表明该技术和前端相关&#xff1b;XML 是指以此进行数据交换。而这两个我们之前都学习过。 1.1.…

iOS开发Xcode中的ld64和-ld_classic是什么意思

在iOS应用程序开发中&#xff0c;Xcode是一款广泛使用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;而链接器是构建应用程序的关键组成部分之一。在Xcode中&#xff0c;我们常常会遇到两个重要的概念&#xff1a;ld64和-ld_classic。它们分别代表了默认链接器和经典链…

前端大屏展示可视化——地图的绘制(持续更新)

一、ECharts 1、安装 npm install echarts2、引入 import * as echarts from echarts;3、渲染 3.1、前期准备&#xff0c;基础配置 // 地图实例 const myChart ref(null); // 地图配置 const option reactive({tooltip: {trigger: item,formatter: function (params) {re…

电脑风扇控制温度软件 Macs Fan Control Pro 中文

Macs Fan Control Pro是一款专为Mac用户设计的风扇控制软件&#xff0c;旨在提供更精细的风扇转速控制和温度监控。这款软件通过实时监测Mac内部硬件的温度&#xff0c;自动或手动调整风扇的转速&#xff0c;以确保系统温度保持在理想范围内。 Macs Fan Control Pro提供了直观…

【01】Linux 基本操作指令

带⭐的为重要指令 &#x1f308; 01、ls 展示当前目录下所有文件&#x1f308; 02、pwd 显示用户当前所在路径&#x1f308; 03、cd 进入指定目录&#x1f308; 04、touch 新建文件&#x1f308; 05、tree 以树形结构展示所有文件⭐ 06、mkdir 新建目录⭐ 07、rmdir 删除目录⭐…