深度学习-神经网络(Pytorch应用)

news2024/11/21 0:13:49

文章目录

  • 简介
  • 卷积层
  • 池化层
  • 激活层
  • 线性层

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介


在这里插入图片描述

上图摘自网络

受生物神经网络的启发,每个神经元与其他神经元相连,当它兴奋的时候就会向相连的神经元发送化学信号,从而改变这些神经元内的电位,当神经元的电位超过阈值后就会被激活,即也变得兴奋起来,继而向其他神经元发送化学信号。

神经网络中可以看成是由若干节点和边组成的图。节点就是神经元,可以存储数字;边用来存储权重,表示传给哪些神经元,而是否超过阈值达到兴奋就是激活函数。神经网络的学习就是从训练数据中,根据损失函数,找到使得损失函数最小的权重参数。

神经网络可以分为前馈神经网络和反馈神经网络。前馈神经网络就是信息从前向后传递,神经元接受上一次的的输入,并输出传递给下一层,各层之间没有反馈。反馈神经网络则可以将输出经过一步的时移,再次接入到输入层当中,神经元间可以互连。此外,也可分为根据每层神经元功能,可以分为输入层、隐含层、输出层。
在这里插入图片描述

上图摘自网络

输入层和输出层是必须有的,中间的隐含层可以没有(单层感知机),也可以有多层(多层感知机)。直观上层数越多,则越表达的特征越多效果越好,但是就像多线程一样,并不是层数无限大效果就无限好。层数越多相应训练参数的算力开销也就越大。

从实际操作上划分,根据具体的功能,隐含层中又可以分为卷积层、池化层、激活层、线性层等。本文将介绍相关原理及Pytorch中代码应用。

卷积层


卷积是最基本常用的操作,可以看作是一种滤波器,对数据进行降维和加工。简单来说,就是相乘相加。
在这里插入图片描述

比如输入为4×4:

1210
2013
0542
4125

卷积核为3×3:

010
211
101

将卷积核与输入左上角对齐,将3×3中9个元素相乘相加:
1×0+2×1+1×0+2×2+0×1+1×1+0×1+5×0+4×1=11

然后将卷积核向右移动一步(可定义移动多步),计算卷积:
2×0+1×1+0×0+0×2+1×1+3×1+5×1+4×0+2×1=12

此时向右不可移动后,移到最左端,遍历下一行,计算卷积:
2×0+0×1+1×0+0×2+5×1+4×1+4×1+1×0+2×1=15

再向右移动一步,计算卷积:
0×0+1×1+3×0+5×2+4×1+2×1+1×1+2×0+5×1=23

最后得到卷积后结果:

1112
1523

可以使用torch.nn.functional中conv2d计算二维卷积,如果有多个卷积核就会生成多层,同样的如果输入有多个,也就是多个通道channel,然后是高height和宽weight。默认移动步长是1,padding填充=0,也就是在输入外围加一圈0,变成6×6。
相关动画可参考官网:https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md

import torch
import torch.nn.functional as F


# 输入
input = torch.tensor([[1, 2, 1, 0],
                      [2, 0, 1, 3],
                      [0, 5, 4, 2],
                      [4, 1, 2, 5],
                      ])
# 卷积核
kernel = torch.tensor([[0, 1, 0],
                       [2, 1, 1],
                       [1, 0, 1]])
# 1层1通道4高4宽
input = torch.reshape(input, (1, 1, 4, 4))
kernel = torch.reshape(kernel, (1, 1, 3, 3))
output = F.conv2d(input,kernel)
print(output)

在这里插入图片描述

创建神经网络,包含一个简单的卷积层,对图像进行卷积:
其中可视化部分可参考另一篇博客:深度学习-Tensorboard可视化面板

import torch
from PIL import Image
from torch import nn
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms


# 自定义神经网络,需继承nn.Module
class MyNet(nn.Module):
    # 初始化
    def __init__(self) -> None:
        super().__init__()
        # 包含一个卷积层,输入通道3,输出通道6,卷积核3,移动步长1,不填充
        self.cov = nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0)

    # 前馈
    def forward(self, x):
        x = self.cov(x)
        return x


writer = SummaryWriter(log_dir='runs/cov')  # 可视化
img_PIL = Image.open('icon.jpg')  # 读取图片
trans = transforms.ToTensor()
img = trans(img_PIL)  # 转为tensor
writer.add_image("input", img)
net = MyNet()  # 创建网络
output = net(img)  # (6,130,130)
output = torch.reshape(output, (-1, 3, 130, 130))  # (2,3,130,130)
writer.add_images("output", output)
writer.close()
output", output)
writer.close()

在这里插入图片描述

池化层


池化可以有效的降维,扩大感知野,实现非线性。大大降低了计算量,降低参数量,减少冗余。常用的池化包括最大池化、平均池化等。

也就是说,把卷积的相乘相加,变成了取最大值/平均值。比如输入为4×4:

1210
2013
0542
4125

使用3×3池化核,最大池化后:

53
45

这里ceil_mode为True,也就是保留取整。第一个5是左上角9个元素中最大元素,然后移动步长不是1,右移到未池化的元素处,也就是{0,3,2}的最大值3,然后回到最左端向下,取{4,1,2}最大值4,最后是取{5}最大值5。若ceil_mode为Fasle(默认),则不足3×3=9个元素的地方都不考虑,池化结果就是5。

import torch
import torch.nn.functional as F


# 输入
input = torch.tensor([[1, 2, 1, 0],
                      [2, 0, 1, 3],
                      [0, 5, 4, 2],
                      [4, 1, 2, 5],
                      ], dtype=torch.float)

# 1层1通道4高4宽
input = torch.reshape(input, (1, 1, 4, 4))
output = F.max_pool2d(input, kernel_size=3, ceil_mode=True)
print(output)

在这里插入图片描述

插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

同样创建一个只含最大池化层的神经网络,对图像进行测试:

from PIL import Image
from torch import nn
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms


# 自定义神经网络,需继承nn.Module
class MyNet(nn.Module):
    # 初始化
    def __init__(self) -> None:
        super().__init__()
        # 包含一个最大池化层,池化核大小3×3,保留取整
        self.pool = nn.MaxPool2d(kernel_size=3, ceil_mode=True)

    # 前馈
    def forward(self, x):
        x = self.pool(x)
        return x


writer = SummaryWriter(log_dir='runs/pool')  # 可视化
img_PIL = Image.open('icon.jpg')  # 读取图片
trans = transforms.ToTensor()
img = trans(img_PIL)  # 转为tensor
writer.add_image("input", img)
net = MyNet()  # 创建网络
output = net(img)
writer.add_image("output", output)
writer.close()

在这里插入图片描述

激活层


线性往往拟合效果差,激活函数加入非线性因素,加入线性因素可以增强拟合能力,同时避免梯度消失等情况。常用的非线性激活函数包括Relu、sigmoid、softmax、Tanh等。

ReLu R e L U ( x ) = m a x ( 0 , x ) ReLU(x)=max(0,x) ReLU(x)=max(0,x)
Sigmoid S i g m o i d ( x ) = l o g ( 1 1 + e x p ( − x ) ) Sigmoid(x)=log(\frac{1}{1+exp(-x)}) Sigmoid(x)=log(1+exp(x)1)
Softmax S o f t m a x ( x i ) = e x p ( x i ) ∑ j x j Softmax(x_i)=\frac{exp(x_i)}{\sum_j{x_j}} Softmax(xi)=jxjexp(xi)
Tanh T a n h ( x ) = e x p ( x ) − e x p ( − x ) e x p ( x ) + e x p ( − x ) Tanh(x)=\frac{exp(x)-exp(-x)}{exp(x)+exp(-x)} Tanh(x)=exp(x)+exp(x)exp(x)exp(x)


图片输入是1-255正值,ReLu后无变化,以Sigmoid测试:

from PIL import Image
from torch import nn
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms


# 自定义神经网络,需继承nn.Module
class MyNet(nn.Module):
    # 初始化
    def __init__(self) -> None:
        super().__init__()
        self.sigmoid = nn.Sigmoid()

    # 前馈
    def forward(self, x):
        x = self.sigmoid(x)
        return x


writer = SummaryWriter(log_dir='runs/sigmoid')  # 可视化
img_PIL = Image.open('icon.jpg')  # 读取图片
trans = transforms.ToTensor()
img = trans(img_PIL)  # 转为tensor
writer.add_image("input", img)
net = MyNet()  # 创建网络
output = net(img)
writer.add_image("output", output)
writer.close()

在这里插入图片描述

线性层


即对张量进行线性变换,就是全连接层,从输入维度转换为输出维度,可以加偏置项。

import torch
from torch import nn


linear = nn.Linear(in_features=10,out_features=5)
input = torch.ones(3, 10)
print(input)
output = linear(input)
print(output)

在这里插入图片描述

还有一些相对少用的层,这里不再赘述。如正则化层,采用正则化可以防止模型过于复杂(过拟合),可以加快神经网络的训练速度。衰减层,按概率随机将元素置零,防止过拟合。更多Layers可参考官方文档。

原创不易,请勿转载本不富裕的访问量雪上加霜
博主首页:https://wzlodq.blog.csdn.net/
来都来了,不评论两句吗👀
如果文章对你有帮助,记得一键三连❤

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

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

相关文章

InfluxDB时序数据库-笔记-更新中

本笔记由在Bilibili学习的尚硅谷教学视频后整理得来 文章目录一、InfluxDB基础概念1.1InfluxDB是什么1.2为什么选择InfluxDB而不选择关系型数据库1.3下载安装1.4Promethus数据格式1.5时序数据中的数据模型1.6与时间标准相关的知识二、Flux语言2.1初识Flux语言2.2Flux基本语法三…

献上SpringBoot核心笔记,简直就是血赚

市面上真正适合学习的SpringBoot资料太少,有的书或资料虽然讲得比较深入,但是语言晦涩难懂,大多数人看完这些书基本都是从入门到放弃。学透SpringBoot难道就真的就没有一种适合大多数同学的方法吗? 很多SpringBoot相关的知识点与…

Java+MySQL学生选课与成绩管理系统(数据库版)

一、项目要求 学生选课与成绩管理系统(数据库版) 1、配置MySQL数据库 2、利用java+MySQL实现系统各个功能 3、功能包括: (1)系统交互界面,如下图所示 (2)学生信息的增删改查。学生属性包括学号(唯一),姓名,专业。 (3)课程信息的增删改查。课程属性包括编号…

96-114-mysql-高级篇-架构篇

96-mysql-高级篇: 推荐网站 mysql学习网站:https://www.bilibili.com/video/BV1iq4y1u7vj?p109&vd_source39a1ba1654411bc9ab90f6f2926600b7 mysql:https://dev.mysql.com/doc/refman/8.0/en/ 算法:https://www.cs.usfca.…

JoyStick Shield连接Nokia 5110--Arduino

SpaceTrash游戏是一个简单的射击游戏,您可以在其中控制宇宙飞船,并通过移动或爆破(使用激光)来避免漂浮在周围的小行星的碰撞。该游戏是u8g2图形库附带的示例,该图形库通常用于连接具有SPI或I2C协议的各种单色8位显示器…

非零基础自学Golang 第1章 走进Go 1.4 常用软件及网站 1.5 小结

非零基础自学Golang 文章目录非零基础自学Golang第1章 走进Go1.4 常用软件及网站1.4.1 开发工具【IDE 或编辑器】1.4.2 代码管理工具1.4.3 其他工具1.4.4 网站资源1.5 小结第1章 走进Go 1.4 常用软件及网站 1.4.1 开发工具【IDE 或编辑器】 工欲善其事必先利其器。 Go开发工…

基于java+springboot+mybatis+vue+mysql的电动车辆充电桩管理系统

项目介绍 随着我国汽车行业的不断发展,电动汽车已经开始逐步的领导整个汽车行业,越来越多的人在追求环保和经济实惠的同时开始使用电动汽车,电动汽车和燃油汽车最大的而不同就是 需要充电,同时我国的基础充电桩也开始遍及了大多数…

机器人开发--SICK激光雷达系列

机器人开发--SICK激光雷达系列1 介绍2 TiM系列2.1 TiM510参数测量方法协议请求一次数据(应答直接携带数据)请求持续数据(应答收到指令,数据持续发送)数据内容参考1 介绍 SICK 是国际先进的工业用传感器应用程序解决方…

016 | 乡村振兴战略下农村宅基地有偿退出现状 | 大学生创新训练项目申请书 | 极致技术工厂

(一)研究目的 随着国家城市化进程的加快,城市和农村的具体情况都发生了巨大变化,大量的问题随之产生,在农村经济中,宅基地的有偿退出矛盾尤为突出。在当前的时代发展背景下,我国农村宅基地有偿…

[附源码]Python计算机毕业设计宠物寄养平台设计Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

git cherry-pick命令用法详解

1、需求背景 想在某个稳定版本上,添加一个刚开发完成的版本中的功能。就可以使用 Cherry-pick 命令,将这个功能相关的 commit 提取出来,合入稳定版本的分支上。 对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。…

VS2015+PCL1.8.1安装

VS2015+PCL1.8.1安装 一、下载PCL1.8.1二、PCL-1.8.1安装三、系统环境变量配置四、 vs2015配置PCL1.8.1一、下载PCL1.8.1 1.1 首先下载pcl1.8.1的库,地址在这:pcl1.8.1库链接。   1.2 打开网站,将页面拉到最下面,下载这个两个文件:PCL-1.8.1-AllInOne-msvc2015-win64.ex…

Windows下C语言程序和网络调试助手通信

网络调试助手之间进行UDP通信 前面一篇文章介绍了Windows下的网络调试助手,文章链接如下: Windows下的TCP/UDP网络调试工具-NetAssist以及Linux下的nc网络调试工具 下面我们简单介绍一下网络调试助手的使用。 这样两个网络调试助手之间就可以进行UDP通…

矩阵 的逆、 迹、 秩

矩阵的逆: 矩阵的逆有是三种方法可以求 1、系数待定法: 2、求伴随矩阵求逆 3、通过求增广矩阵求出逆 矩阵的迹 什么是矩阵的迹 矩阵的迹是特征值的加和,也即矩阵A的主对角线元素的总和。 案例 矩阵的秩 什么是矩阵的秩 设 AA 为 m\tim…

Vue 进阶一 | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘Vue 该笔记特点是 重新整理了涉及资料的一些语言描述、排版而使用了自己的描述对一些地方做了补充说明。比如解释专有名词、类比说明、对比说明、注意事项提升了总结归纳性。尽可能在每个知识点上都使用一句话 || 关键词概括更注重在实际上怎么应用提出并回答…

20221212英语学习

今日单词: sweet adj.含糖的, 甜的, 香的, 芳香的 founding n.建立,成立 software n.软件 pour n.流出, 大雨, 【冶】浇注, (已熔金属的)一次浇注量 recipe n.烹饪法,食谱;方法,秘诀,诀窍 graph n.图, 图表, 曲线…

Vue2 插槽的使用【默认插槽、具名插槽、作用域插槽】

前言: 这篇文章我们一起来学习一下 Vue2 插槽的使用,文章大致分为两个模块,第一部分是什么是插槽,其作用是什么,第二部分为三种插槽的使用,分别为默认插槽,具名插槽,作用域插槽&…

Vue快速上门|虚拟DOM

直接操作DOM,DOM频繁变动会使得页面不停的布局、渲染,是很消耗性能的,虚拟DOM就是来解决这个问题的。虚拟DOM 就是先在内存中构建一个虚拟DOM结构(JS对象表示),批量操作完成后再一次性的更新到浏览器DOM树上。VUE中的虚拟DOM操作思路也是如此,只是为了更高效,实际要稍微…

[附源码]Node.js计算机毕业设计大数据与智能工程系教师档案管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

Docker之RUN、COMMAND、ENTRYPOINT辨析

一 回顾docker一些命令 ① run create start 的辨析 docker run 等价 docker create && docker start容器(动态) 镜像(静态) 读写层1) create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器注意&#xff1…