深度学习代码学习(一文真正看懂卷积层的代码定义)

news2024/11/14 10:56:52
一维卷积:

将n行3列升维到n行6列。(原因:卷积核为6个)

*表示点乘

 Linear线性层:

(通过矩阵计算改变输入输出特征向量的维度)

Pytorch nn.Linear的基本用法与原理详解-CSDN博客 

pytorch初学笔记(十二):神经网络基本结构之线性层-CSDN博客

二维卷积:

torch学习 (十六):二维卷积层_torch 二维卷积定义-CSDN博客

 神经网络基本搭建:torch.nn

对类初始化讲解的好的文章:

 解惑(一) ----- super(XXX, self).__init__()到底是代表什么含义_super(,self).__init__-CSDN博客

 CONV1D一维卷积神经网络运算过程(举例:n行3列➡n行6列)-CSDN博客

神经网络的基本框架的搭建-nn.Module-CSDN博客

神经网络类定义举例:
# Convolution operation
class ConvLayer(torch.nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride, is_last=False):
        super(ConvLayer, self).__init__()
        reflection_padding = int(np.floor(kernel_size / 2))
    #np.floor()向下取整
    #kernel_size 卷积核的大小
        self.reflection_pad = nn.ReflectionPad2d(reflection_padding)
        self.conv2d = nn.Conv2d(in_channels, out_channels, kernel_size, stride)
        self.dropout = nn.Dropout2d(p=0.5)
        self.is_last = is_last

    def forward(self, x):
        out = self.reflection_pad(x)
        out = self.conv2d(out)
        if self.is_last is False:
            # out = F.normalize(out)
            out = F.relu(out, inplace=True)
            # out = self.dropout(out)
        return out

上面的代码定义了一个卷积操作类;

class ConvLayer(torch.nn.Module):

定义了类ConvLayer,继承自torch.nn.Module,也就是说torch.nn.Module是类ConvLayer的父类。

  def __init__(self, in_channels, out_channels, kernel_size, stride, is_last=False):
        super(ConvLayer, self).__init__()
        reflection_padding = int(np.floor(kernel_size / 2))
    #np.floor()向下取整
    #kernel_size 卷积核的大小
        self.reflection_pad = nn.ReflectionPad2d(reflection_padding)
        self.conv2d = nn.Conv2d(in_channels, out_channels, kernel_size, stride)
        self.dropout = nn.Dropout2d(p=0.5)
        self.is_last = is_last

定义了ConvLayer的类初始化函数,在创建ConvLayer对象时自动调用,也就是说在创建对象的时候自己就初始化了,不需要再使用init函数。

 def __init__(self, in_channels, out_channels, kernel_size, stride, is_last=False):

括号中是可以传入的参数。

super(ConvLayer, self).__init__()

这句代码的意思是说要将ConvLayer的实例(对象)self,转化为它的父类对象,也就是torch.nn.Module,再进行初始化。

 reflection_padding = int(np.floor(kernel_size / 2))
reflection_padding=1
self.reflection_pad = nn.ReflectionPad2d(reflection_padding)
        self.conv2d = nn.Conv2d(in_channels, out_channels, kernel_size, stride)
        self.dropout = nn.Dropout2d(p=0.5)
        self.is_last = is_last

在初始化中对ConvLayer的对象定义了四个属性,

reflection_pad属性:只往左右填充宽度为1的元素。

反射填充详解ReflectionPad2d(padding)-CSDN博客

conv2d属性:二维卷积
dropout属性:把某个张量置0

(Pytorch)nn.Dropout以及Dropout1d,Dropout2d,Dropout3d是什么意思_nn.dropout2d-CSDN博客

is_last属性:是不是最后一层
  def forward(self, x):
        out = self.reflection_pad(x)
        out = self.conv2d(out)
        if self.is_last is False:
            # out = F.normalize(out)
            out = F.relu(out, inplace=True)
            # out = self.dropout(out)
        return out

前向传播函数:self是类实例本身,x是传进来的参数。

将反射填充x后的ConvLayer类实例赋值给out,

对out进行2d卷积,

判断是不是最后一层卷积层,如果不是,对刚卷积的结果进行relu激活。

inplace为True,将会改变输入的数据 ,否则不会改变原输入,只会产生新的输出。

激活函数(ReLU):nn.ReLU(inplace=True)-CSDN博客

forward的返回结果为out。

总结:

init函数基本上定义的是类对象可以使用的参数和方法,(也就是说定义完实例对象实例对象拥有了一些参数和可以使用的功能),

然后使用这些参数和方法的是实例对象的forward函数。

实例对象通过调用forward函数来实现真正的卷积层。

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

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

相关文章

玩转硬件之Micro:bit的玩法(六)——扫地机器人

众所周知,扫地机器人,又称自动打扫机、智能吸尘、机器人吸尘器等,是智能家电的一种,能凭借人工智能,自动在房间内完成地板清理工作。一般采用刷扫和真空方式,将地面杂物先吸纳进入自身的垃圾收纳盒&#xf…

【DDR】基于Verilog的DDR控制器的简单实现(三)——读操作

上一节 【DDR】基于Verilog的DDR控制器的简单实现(二)——写操作 本文继续以美光(Micron)公司生产的DDR3芯片MT41J512M8RH-093(芯片手册)为例,说明DDR芯片的读操作过程。下图为读操作指令格式(…

Linux驱动(五)设备树

1、前言 设备树是一种描述硬件平台和设备的数据结构,它以一种结构化的方式描述了系统中的各种设备和资源,包括处理器、内存、外设和总线等。设备树通常用于嵌入式系统和嵌入式 Linux 系统中,它可以帮助操作系统内核在启动时自动识别硬件&…

记录一次git merge后发现有些文件不对的问题,排查过程

分支进行merge(A merge到B)之后,发现string.xml中有些字段的值没有merge过来,一开始还以为自己是自己merge错误,检查了一遍自己的merge操作没有问题。 那为啥没有merge过来呢?有一种可能是,merg…

软件测试|Python数据可视化神器——pyecharts教程(十三)

使用pyecharts绘制水球图 水球图是一种有趣而视觉吸引力的数据可视化方式,它可以用来展示进度或百分比等信息。这方面水球图和仪表图是类似的,但是水球图比仪表图更为炫酷一些。像一些资源占用率等指标都是使用水球图来展示的,作为绘图神器&…

LaTeX 章节的使用

目录 1、介绍 2、章节的等级 3、取消编号章节 4、章节引用 1、介绍 命令\section{}标志着一个新章的开始,大括号内的文字为章的标题。章的编号是自动生成的,你也可以使用没有编号的章。 \documentclass[]{article}\begin{document}\section{Introd…

在服务器上使用Docker运行SRS Stack,推拉直播流、多平台转播、本地录制、虚拟直播、直播转码、AI字幕、其他

SRS Stack | SRS (ossrs.net) Docker​ 推荐使用Docker运行SRS Stack: docker run --restart always -d -it --name srs-stack -v $HOME/data:/data \-p 2022:2022 -p 2443:2443 -p 1935:1935 -p 8000:8000/udp -p 10080:10080/udp \registry.cn-hangzhou.aliyun…

设备之AP555【之一】

1、Audio Precision官网 Audio Precision 是声学及音频测试中公认的标准。AP提供了高性能声学和音频分析仪,配件和应用程序,帮助全球工程师设计,验证和制造消费电子、专业和工业的声学和音频产品。 APX555B 是具有三十年经验的测试设备&…

第十二章 Java内存模型与线程(二)

文章目录 12.4 Java与线程12.4.1 线程的实现12.4.2 Java线程调度12.4.3 状态转换 12.4 Java与线程 12.4.1 线程的实现 实现线程主要有三种方式:使用内核线程实现(1: 1 实现),使用用户线程实现(1&#xff…

内网穿透[让你在家里也能榨干学校的服务器]Yep!

内网穿透 问题:什么是内网穿透,内网穿透的作用是什么? 前提!!!!你得拥有超级管理员的权限,比如root,不然后面的一切免提! 应用场景如下:比如你…

MOS管驱动电流计算以及分立器件驱动电路

自记: 1.先根据mos数据手册查找参数,计算电流; 2.分立器件驱动电路图; 3.分立器件选择 仔细学,能看懂! 1.计算电流: 2.分立器件驱动电流:两种,第一种反向&#xff0c…

HCIP-3

重发布、重分布、重分发: ASBR同时工作于不同的路由协议中,然后通过各种的方式学习的条目,再进行共享; 必须存在ASBR----自治系统边界路由器--协议边界路由器需要考虑种子度量 规则: 将A协议发布到B协议&#xff0c…

TS快速上手

1.类型声明 let a: string //变量a只能存储字符串 let b: number //变量a只能存储数值 let c: boolean //变量a只能存储布尔值 a hello a 100 //警告:不能将类型“number”分配给类型“string” b 666 b 你好//警告:不能将类型“string”分配给类型…

重学Java 6 流程控制语句

我与我,至死不渝 ——24.1.15 模块重点: ①会使用Scanner和Random ②会使用switch以及知道case的穿透性 ③会使用if ④会使用for循环,while循环,嵌套循环 一、键盘录入_Scanner 1.概述:是Java定义好的一个类 2.作用&am…

把握现货黄金的基本操作技巧

在投资市场这个大舞台上,有各种各样的投资产品供投资者选择,其中黄金作为一种重要的投资资产,一直受到广大投资者的青睐。然而,黄金交易并非易事,需要掌握一定的操作技巧。那么,如何才能把握住现货黄金的操…

基础面试题整理4

1.mybatis的#{}和${}区别 #{}是预编译处理,${}是字符串替换#{}可以防止SQL注入,提高安全性 2.mybatis隔离级别 读未提交 READ UNCOMMITED:读到了其他事务中未提交的数据,造成"脏读","不可重复读","幻读&…

DBA技术栈(三):MySQL 性能影响因素

文章目录 前言一、影响MySQL性能的因素1.1 商业上的需求1.2 应用架构规划1.3 查询语句使用方式1.4 Schema的设计1.5 硬件环境 总结 前言 大部分人都一致认为一个数据库应用系统(这里的数据库应用系统概指所有使用数据库的系统)的性能瓶颈最容易出现在数…

ssm+vue的物流配送人员车辆调度管理系统的设计与实现(有报告)。Javaee项目,ssm vue前后端分离项项目。

演示视频: ssmvue的物流配送人员车辆调度管理系统的设计与实现(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller&…

day-10 删除排序链表中的重复元素

思路 先统计每个值出现的次数,然后将出现次数为一的节点链接为一个链表即可 解题方法 while(t!null){ //统计每个值出现次数 arr[t.val100]1; tt.next; } while(t!null&&arr[t.val100]!1) tt.next;//确定返回的头结点 ttt; while(t!null&&t.next…

虾皮广告数据:​如何利用广告数据优化虾皮(Shopee)销售业绩

在虾皮(Shopee)平台上,广告数据对于卖家来说是至关重要的,它可以帮助卖家了解广告的效果并进行相应的优化。通过监控和分析这些广告数据,卖家可以更好地理解广告的表现,调整广告策略,提高广告的…