Pytorch入门(二)神经网络的搭建

news2024/11/22 22:43:39

torch.nn中的nn全称为neural network,意思是神经网络,是torch中构建神经网络的模块。

文章目录

  • 一、神经网络基本骨架
  • 二、认识卷积操作
  • 三、认识最大池化操作
  • 四、非线性激活
  • 五、线性层及其它层介绍
  • 六、简单的神经网络搭建
  • 七、简单的认识神经网络中的数值计算
  • 八、损失函数与反向传播的应用

一、神经网络基本骨架

CNN卷积神经网络基本包含五个层

  • ①输入层
    • 主要做什么?数据的预处理
      • 去均值
      • 归一化
      • PCA/SVD降维等
    • 使用模块
      • transforms
  • ②卷积层
    一个图像占有很大的维数,但是图像的特征所在的维数远小于一个图像的维数
    在训练时冗余的维数会拖慢训练进度,我们要使用卷积降低维数,又保留特征(人识别不出特征计算机可以)
  • ③激活(激励)层
    • 主要做什么?
      • 对卷积层得出的结果做一次非线性映射
    • 主要使用函数
      • sigmoid
      • tanh
      • relu
      • leaky relu
      • elu
      • maxout
  • ④池化层(又称欠采样或下采样)
    • 主要作用:
      • 特征降维,压缩数据参数、数量,减小过拟合提高模型的容错性
    • 主要模块
      • 平均池化:MaxPooling
      • 最大池化:Average Pooling
  • ⑤全连接fc层
    • 经过多次卷积、激励、池化后没有出现过拟合可以认为模型训练完毕

二、认识卷积操作

  • 卷积相关概念
    • 卷积核:一定大小的矩阵,利用该矩阵与目标矩阵进行运算
    • 卷积操作:具体运算是对应项相乘再相加,计算结果放在新生成的位置
  • 卷积操作常用函数
    • conv1d(一维卷积)
    • conv2d(二维卷积)
    • conv3d(三维卷积)
  • 卷积时传进去的参数意义
    • input 需要进行操作的矩阵
    • weight 矩阵的权重
    • stride 每次卷积完下次卷积移动的步长
    • padding 目标矩阵在进行卷积操作的时候,是否进行外边界的填充

在这里插入图片描述

下面代码模拟了一下卷积操作:

# 模拟一下卷积操作
# 目标矩阵
objA=torch.tensor([[1,2,0,3,1],
      [0,1,2,3,1],
      [1,2,1,0,0],
      [5,2,3,1,1],
      [2,1,0,1,1]])
# 卷积核
coCore=torch.tensor([[1,2,1],
        [0,1,0],
        [2,1,0]])
input=torch.reshape(objA,(1,1,5,5))
coCore=torch.reshape(coCore,(1,1,3,3))
# 步长为1没有外边界填充
output1=F.conv2d(input,coCore,stride=1)
# 向外扩充一圈
output2=F.conv2d(input,coCore,stride=1,padding=1)
print(output1)
print(output2)

结果(可以自己计算测试一下):

tensor([[[[10, 12, 12],
          [18, 16, 16],
          [13,  9,  3]]]])
tensor([[[[ 1,  3,  4, 10,  8],
          [ 5, 10, 12, 12,  6],
          [ 7, 18, 16, 16,  8],
          [11, 13,  9,  3,  4],
          [14, 13,  9,  7,  4]]]])

Process finished with exit code 0

将数据传入神经网络,进行多层卷积会得到具有明显特征的图片

测试一下神经网络中的卷积:

import os

import torch
import torchvision.datasets
from torch import nn
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
'''
将数据传入神经网络,进行多层卷积会得到具有明显特征的图片
'''
basepath=os.path.split(os.getcwd())[0]
# 获取需要使用的数据集
dataset=torchvision.datasets.CIFAR10(basepath+r"\数据集",train=False,transform=torchvision.transforms.ToTensor(),download=True)
# 加载数据集其中64个打包分成一块
dataloader=DataLoader(dataset,batch_size=64)
# 自定义一个神经网络类
class Model(nn.Module):
    def __init__(self):
        super(Model,self).__init__()
        # 初始化一层卷积
        # channels          英文意思是频道
        # in_channels       向神经网络输送的数据频道数量
        # out_channels      神经网络输出的频道数量
        # kernel_size       卷积核的大小,输出的时候会将卷积核根据其大小正方形化
        # stride            每次卷积移动的步长,输出的时候也是一个元组,代表左右上下都是移动1
        self.conv1=Conv2d(in_channels=3,out_channels=6,kernel_size=3,stride=1,padding=0)
    def forward(self,x):
        x=self.conv1(x)
        return x
# 创建日志文件,显示图像表示的效果
writer=SummaryWriter("logs_Conv")
# 生成神经网络模型
myModel=Model()
# print(myModel)
stept=0
# 迭代打包好的数据,将数据输送到神经网络进行卷积,最后得出卷积后的图片
for data in dataloader:
    # 获取数据与标签
    imgs,targets=data
    # 将数据输送到神经网络
    output=myModel(imgs)
    print(imgs.shape)
    print(output.shape)
    # 输出的数据是3,6,30,30   30为尺寸
    # tensorboard无法识别6维的图片,使用reshape修改图片形状
    output=torch.reshape(output,(-1,3,30,30))
    # 将图片加入到tensorBoard中
    writer.add_images("input",imgs,stept)
    writer.add_images("output",output,stept)
    stept=stept+1
    # 如果一个图片经过卷积尺寸没有改变并且维度变大,那么可能进行了卷积时的边界填充

三、认识最大池化操作

最大池化的作用:
通过卷积核大小将图片各个区域的最大值选出来
一般最大池化后会将数据的大小大大减小,以此提高训练速度
最大池化会将数据比较明显的特征提取出来
在日常神经网络训练过程中,通常将卷积,最大池化,激活函数交替使用

最大池化,Tensor变化,我记得还有平均池化之类的东西,感兴趣大家自己研究研究。
在这里插入图片描述

import os

import torch.nn as nn
import torch
import torchvision
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
basepath=os.path.split(os.getcwd())[0]
# 初始化数据集
writer=SummaryWriter(basepath+r"\logss\logs9_1")
dataset=torchvision.datasets.CIFAR10(basepath+r"\数据集",train=False,transform=torchvision.transforms.ToTensor())
dataloader=DataLoader(dataset,64)
class Model(nn.Module):
    def __init__(self):
        super(Model,self).__init__()
        self.pool1=MaxPool2d(kernel_size=2,ceil_mode=True)
    def forward(self,input):
        output=self.pool1(input)
        return output
# 创建神经网络模型
myModel=Model()
step=0
for data in dataloader:
    imgs,targes=data
    output=myModel(imgs)
    writer.add_images("pool_test",output,step)
    step=step+1
writer.close()

池化过后的图片:
在这里插入图片描述

四、非线性激活

当数据混乱冗杂时,不带激活函数的单层感知机是一个线性分类器,线性函数无法对各个类别进行分类
激活函数是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型无法解决的问题

单层感知机是最基础的神经网络,感知机网络与卷积网络都属于前馈型网络
单层感知机网络是二分类的线性分类模型,输入是被感知数据集的特征向量,输出是数据集的类别

在这里插入图片描述

五、线性层及其它层介绍

  • Linear Layers线性层

  • Dropout Layers 随机将一些数据置为0
    Dropout函数参数
    第一个参数p是被置为0的概率,第二个参数inplace 是否在本次样本进行操作默认为false

  • Normalization正则化层

  • Recurrent Layers

  • Transformer Layers

  • Sparse Layers 一般用于自然语言处理

import os

import torch.nn as nn
import torch
import torchvision.datasets
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

basepath=os.path.split(os.getcwd())[0]
# 预处理数据集
dataset=torchvision.datasets.CIFAR10(basepath+r"\数据集",train=False,transform=torchvision.transforms.ToTensor())
dataloader=DataLoader(dataset,64)
writer=SummaryWriter(basepath+r"\logss\log_6")
class Model(nn.Module):
    def __init__(self):
        super(Model,self).__init__()
        '''
        Linear()
        第一个参数是输入的样本大小,第二个是输出的样本大小,第三个是是否偏执,默认为true
        '''
        self.line1=nn.Linear(196608,10)
    def forward(self,input):
        output=self.line1(input)
        return output
myModel=Model()
step=0
for data in dataloader:
    imgs,targets=data
    print(imgs.shape)
    # 该函数直接将多维数组直接转换成一维数组
    output=torch.flatten(imgs)
    print(output.shape)
    output=myModel(output)
    print(output.shape)
    # writer.add_images("test",output,step)
    step=step+1

六、简单的神经网络搭建

普通方式

import os

import torch
import torch.nn as nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.tensorboard import SummaryWriter
basepath=os.path.split(os.getcwd())[0]

class Model(nn.Module):
    def __init__(self):
        super(Model,self).__init__()
        self.con1=Conv2d(3, 32, 5, padding=2)
        self.maxp1=MaxPool2d(2)
        self.con2=Conv2d(32, 32, 5, padding=2)
        self.maxp2=MaxPool2d(2)
        self.con3=Conv2d(32, 64, 5, padding=2)
        self.maxp3=MaxPool2d(2)
        self.fla=Flatten()
        self.lin1=Linear(1024, 64)
        self.lin2=Linear(64, 10)
    def forward(self,x):
        x=self.con1(x)
        x=self.maxp1(x)
        x=self.con2(x)
        x=self.maxp2(x)
        x=self.con3(x)
        x=self.maxp3(x)
        x=self.fla(x)
        x=self.lin1(x)
        x=self.lin2(x)
        return x

Sequential方式
构建神经网络的另一个方法,也可以说是快速构建方法,就是通过torch.nn.Sequential,直接完成对神经网络的建立。

import os

import torch
import torch.nn as nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.tensorboard import SummaryWriter
basepath=os.path.split(os.getcwd())[0]

class Model(nn.Module):
    def __init__(self):
        super(Model,self).__init__()
        self.model1 = Sequential(
            # 卷积
            Conv2d(3, 32, 5, padding=2),
            # 池化
            MaxPool2d(2),
            Conv2d(32, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 64, 5, padding=2),
            MaxPool2d(2),
            # 展开为一维数组
            Flatten(),
            # 线性映射
            Linear(1024, 64),
            Linear(64, 10)
        )
    def forward(self,x):
        x=self.model1(x)
        return x

直接打印创建的对象可以看到网络结构,也可以通过之前介绍到的tensorboard查看网络结构:

myModel=Model()
writer=SummaryWriter(basepath+r"\logss\log_7")
print(myModel)
input=torch.ones((64,3,32,32))
output=myModel(input)
print(output.shape)
# 将搭建的神经网络结构绘制到tensorboard中
writer.add_graph(myModel,input)
writer.close()

输出结果如下:

Model(
  (model1): Sequential(
    (0): Conv2d(3, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (2): Conv2d(32, 32, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (4): Conv2d(32, 64, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))
    (5): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (6): Flatten(start_dim=1, end_dim=-1)
    (7): Linear(in_features=1024, out_features=64, bias=True)
    (8): Linear(in_features=64, out_features=10, bias=True)
  )
)
torch.Size([64, 10])

Process finished with exit code 0

在这里插入图片描述

七、简单的认识神经网络中的数值计算

import torch
from torch.nn import L1Loss
import torch.nn as nn
input=torch.tensor([1,2,3],dtype=torch.float32)
target=torch.tensor([1,2,5])
input=torch.reshape(input,(1,1,1,3))
target=torch.reshape(target,(1,1,1,3))
# 获取损失函数计算器(计算差值)
# reduction可以进行修改
loss=L1Loss(reduction="sum")
result_loss=loss(input,target)
print(result_loss)
# 计算平方差
loss_mse=nn.MSELoss()
result_loss_mse=loss_mse(input,target)
print(result_loss_mse)
# 交叉熵
x=torch.tensor([0.1,0.2,0.3])
y=torch.tensor([1])
# 这里(1,3)代表有三个类别一个进行选择
x=torch.reshape(x,(1,3))
loss_cross=nn.CrossEntropyLoss()
result_loss=loss_cross(x,y)
print(result_loss)

八、损失函数与反向传播的应用

  • 损失函数
    损失函数用于检测最后的数据结果与最开始的数据存在的差值(默认计算的是平均损失值,可以对reduction参数进行修改,改为自己想进行的运算方式)计算实际得到的结果与预测结果的差值
  • 反向传播
    损失函数进行完损失值的计算,使用反向传播会给数据下一次进入神经网络提供一些参数进行参考,以减小损失值结合优化器一块使用,反向传播告诉神经网络,模型的好坏,哪里需要调整
  • 优化器
    损失函数进行误差估计,反向传播将数据参数给优化器,然后优化器根据梯度对训练方式进行优化
    优化器没进行完一次优化,就需要将数据清理一次
import os

import torchvision.datasets
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
import torch
import torch.nn as nn
from torch.utils.data import  DataLoader
basepath=os.path.split(os.getcwd())[0]
dataset=torchvision.datasets.CIFAR10(basepath+r"\数据集",train=False,transform=torchvision.transforms.ToTensor(),download=True)
dataloader=DataLoader(dataset,1)
class Model(nn.Module):
    def __init__(self):
        super(Model,self).__init__()
        self.model1 = Sequential(
            # 卷积
            Conv2d(3, 32, 5, padding=2),
            # 池化
            MaxPool2d(2),
            Conv2d(32, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 64, 5, padding=2),
            MaxPool2d(2),
            # 展开为一维数组
            Flatten(),
            # 线性映射
            Linear(1024, 64),
            Linear(64, 10)
        )
    def forward(self,x):
        x=self.model1(x)
        return x
myModel=Model()
# 创建损失函数
loss=nn.CrossEntropyLoss()
# 获取优化器
optim=torch.optim.SGD(myModel.parameters(),lr=0.01)#lr指的是训练速率,这个速率不可以过高,也不可以太低,过高会使模型不稳定
for x in range(20):#过低训练速度太慢
    runing_loss=0.0
    for data in dataloader:
        imgs,targets=data
        output=myModel(imgs)
        # print(output)
        # print(targets)
        result_loss=loss(output,targets)
        optim.zero_grad()
        result_loss.backward()
        optim.step()
        runing_loss=runing_loss+result_loss
    print(runing_loss)

在这里插入图片描述

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

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

相关文章

mmdetection训练coco数据集(继跑通后的一些工具使用)

(仅做个人过程记录的笔记) 1、生成中间件 可以选择评估方式 --eval ,对于 COCO 数据集,可选 bbox 、segm、proposal 。可以得到result.bbox.json文件 生成pkl文件:faster_rcnn.pkl python tools/test.py config.py …

利用栈和队列共同解决迷宫问题

文章目录 什么是迷宫问题?如何解决迷宫问题?DFS(深度优先搜索)BFS(广度优先搜索) 总结 什么是迷宫问题? 迷宫问题是一道经典的算法问题,旨在寻找一条从起点到终点的最短路径。通常迷…

games101作业6

作业要求 Render() in Renderer.cpp: 将你的光线生成过程粘贴到此处,并且按照新框 架更新相应调用的格式。Triangle::getIntersection in Triangle.hpp: 将你的光线-三角形相交函数 粘贴到此处,并且按照新框架更新相应相交信息的格式。 在本次编程练习中…

删除排序链表中的重复元素(java)

删除链表中的重复元素 leetcode 83 题 删除链表中的重复元素解题思路代码链表专题 leetcode 83 题 删除链表中的重复元素 leetcode 83 题 – 跳转链接 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。…

Python numpy - 数组与矩阵的创建&运算

数组array 一 数组的创建 (至少两个数组)创建随机整数数组 a 和 b import numpy as np a np.random.randint(10,size20).reshape(4,5) b np.random.randint(10,size20).reshape(4,5) 二 数组常用函数 数组常用函数 函数作用unique(&…

Transformer part2

(179条消息) Transformer模型入门详解及代码实现_transformer模型代码-CSDN博客 transformer的encoder和decoder的差别 1. decoder包含两个 Multi-Head Attention 层。 decoder第一个 Multi-Head Attention 层采用了 Masked 操作。 为什么需要Mask处理 如何进行Mask处理 de…

【C#图解教程】第五章 类的基本概念

程序和类 类是一个能储存数据并执行代码的经过封装的数据结构,包含数据成员和函数成员,类内通常会包含逻辑上相关的数据和函数,所以类通常会代表真实世界或概念上的事物。 运行中的C#程序实质上是许多实例之间相互作用: 类的声…

ThingsBoard 前端项目内置部件开发

ThingsBoard 是目前 Github 上最流行的开源物联网平台(12.8k Star),可以实现物联网项目的快速开发、管理和扩展,是中小微企业物联网平台的不二之选。 本文介绍如何在 ThingsBoard 前端项目中开发内置的菜单导航部件。 内置相关部…

clickhouse简介

文章目录 1:简介1.1:CH是什么?1.2:CH优势1.3:架构设计 2:CH接口3:CH引擎1:数据库引擎3.1.1:mysql引擎 2:表引擎3.2.1:MergeTree3.2.2:集成引擎1&a…

电子合同签署协议开源版系统开发

电子合同签署协议开源版系统开发 H5TP6mysqlphp 源码开源不加密 以下是电子合同系统可能包含的功能列表: 用户注册和登录:用户可以注册并登录系统,以便创建、签署和管理合同。合同创建:用户可以创建新合同,包括填写合…

Web的基本漏洞--SQL注入漏洞

目录 一、SQL注入介绍 1.SQL注入漏洞原理 2.SQL注入漏洞的类型 3.SQL注入漏洞识别 4.攻击方式 5.SQL盲注 时间盲注 布尔盲注 报错盲注 6.SQL注入漏洞的危害 7.SQL注入漏洞的防范措施 8.SQL注入漏洞的绕过 一、SQL注入介绍 1.SQL注入漏洞原理 Web程序输入的数据传…

使用git rebase合并多次commit

目录 rebase的作用简要概括为:命令:解决冲突:遗留问题: rebase的作用简要概括为: 可以对某一段线性提交历史进行编辑、删除、复制、粘贴;因此,合理使用rebase命令可以使我们的提交历史干净、简…

docker安装php

在安装 php 之前,我们可以先查看一下我们的镜像: docker images 我这里是已经存在 php 镜像了,版本就是 TAG 显示的 8.1.16 如果没有镜像,则执行下面的命令,拉取 php 镜像: docker pull php:latest 请注…

MAYLAND HOME官网上线 | LTD家居家装行业案例分享

​一、公司介绍 在MAYLAND HOME,我们为我们对质量和服务的承诺感到自豪。我们相信我们的成功与客户的满意度直接相关,这就是为什么我们努力超越您的期望,我们承担的每一个项目。无论您是想升级您的家庭还是企业,我们都会在这里帮助…

SpringBoot3 CORS跨域访问

目录 Credentials 问题一 问题二 解决方法一 CrossOrigin,最优的方法 解决方法二 通过Filter 设置HTTP 解决方法三 通过实现WebMvcConfigurer设置HTTP HTTP 协议,需要认真的学习每个细节。 allowCredentials(true) 和 allowed-origins: "*&qu…

MySQL--万文长字探究隔离性实现原理

1 隔离性简介 事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)四个特性,简称 ACID,缺一不可。这篇文章旨在讲清楚…

吐血整理 二叉树(链表实现)的基本操作详解!

文章目录 节点设置二叉树的深度优先遍历前序遍历中序遍历后序遍历 二叉树的广度优先遍历层序遍历 节点的个数叶子节点的个数第K层节点的个数值为X的节点树的最大深度翻转二叉树判断两颗二叉树是否相同判断二叉树是否是完全二叉树判断二叉树是否是单值二叉树判断二叉树是否是平衡…

有哪些好用的pdf修改器?思路提供

PDF格式的文档在现代生活中扮演着越来越重要的角色。但是,要编辑或修改PDF文件是一件非常困难的事情,因为PDF文件的格式和内容通常被锁定。为了解决这个问题,出现了PDF修改器这种工具,它可以帮助用户轻松地编辑和修改PDF文件。本文…

RDK X3 Module发布,全新软硬件平台加速实现量产级产品落地

机器人开发是一段美妙的旅程。GEEKROS创始人杨状状是地平线社区的一名开发者,热衷于鼓捣各类机器人,2022年,状状第一时间就拿到了地平线旭日X3派(简称旭日X3派),基于TogetheROS™.Bot机器人操作系统&#x…

Win11集成 ChatGPT,任务栏取消分组真的回来了

时隔两月微软如期发布了 Win11 Moments 3 更新,版本号 22621.1778 。 微软这次更新带来了许多质量更新和功能改进。 直观的改动是任务栏,网络图标在连接加密隧道时会上锁,时间显示到秒也重新回归。 日常会用到的 AltTab 任务选项卡被限制到最…