从0开始深度学习(20)——延后初始化和自定义层

news2024/11/26 11:06:03

一般情况下,模型参数在被创建时就被立即初始化了,但如果使用了延后初始化技术,就能在首次传入数据后,再初始化参数,旨在输入维度未知的情况下,预定义灵活的模型,动态推断各个层的参数大小。

有时我们会遇到或要自己发明一个现在在深度学习框架中还不存在的层。 在这些情况下,必须构建自定义层。本节将展示如何构建自定义层。

1 延后初始化的使用场景

  1. 动态输入形状:在某些情况下,模型的输入形状可能不是固定的,而是动态变化的。例如,在自然语言处理任务中,输入句子的长度可能会有所不同。
  2. 简化模型定义:延后初始化可以简化模型的定义,避免在模型构建阶段手动指定每个层的输入和输出形状。

2 pytorch实现延后初始化

在 PyTorch 中,可以通过 torch.nn.Lazy 模块来实现延后初始化。torch.nn.Lazy 模块提供了一些常见的层,如 LazyLinearLazyConv2d 等,这些层在第一次前向传播时自动确定参数的形状。

以下是一个简单的示例,展示了如何使用 torch.nn.LazyLinear 进行延后初始化:

import torch
import torch.nn as nn

class LazyNet(nn.Module):
    def __init__(self):
        super(LazyNet, self).__init__()
        self.lazy_linear = nn.LazyLinear(out_features=10)
		# 没有指定输出维度,只指定了输出维度
    def forward(self, x):
        x = self.lazy_linear(x)
        return x

# 创建模型实例
net = LazyNet()

# 创建一个输入张量,假设输入形状为 (batch_size, input_features)
input_data = torch.randn(32, 100)

# 第一次前向传播,此时会自动确定 `LazyLinear` 层的输入形状
output = net(input_data)

print(output.shape)  # 输出形状为 (32, 10)

运行结果:
在这里插入图片描述

3 自定义层

3.1 不带参数的层

我们构造一个没有任何参数的自定义层,下面的CenteredLayer类要从其输入中减去均值。 要构建它,我们只需继承基础层类并实现前向传播功能。

import torch
import torch.nn.functional as F
from torch import nn


class CenteredLayer(nn.Module):
    def __init__(self):
        super().__init__()

    def forward(self, X):
        return X - X.mean()

传入一些数据进行验证

layer = CenteredLayer()
layer(torch.FloatTensor([1, 2, 3, 4, 5]))

在这里插入图片描述
现在,我们可以将层作为组件合并到更复杂的模型中。作为额外的健全性检查,我们可以在向该网络发送随机数据后,检查均值是否为0。 由于我们处理的是浮点数,因为存储精度的原因,我们仍然可能会看到一个非常小的非零数。

net = nn.Sequential(nn.Linear(8, 128), CenteredLayer())
Y = net(torch.rand(4, 8))
Y.mean()

在这里插入图片描述

3.2 带参数的层

下面我们继续定义具有参数的层, 这些参数可以通过训练进行调整。现在,让我们实现自定义版本的全连接层。 回想一下,该层需要两个参数,一个用于表示权重,另一个用于表示偏置项。 在此实现中,我们使用修正线性单元作为激活函数。 该层需要输入参数:in_units和units,分别表示输入数和输出数。

class MyLinear(nn.Module):
    def __init__(self, in_units, units):
        super().__init__()
        self.weight = nn.Parameter(torch.randn(in_units, units))
        self.bias = nn.Parameter(torch.randn(units,))
    def forward(self, X):
        linear = torch.matmul(X, self.weight.data) + self.bias.data
        return F.relu(linear)

接下来实例化模型,并访问其参数:

linear = MyLinear(5, 3)
linear.weight

在这里插入图片描述
我们可以使用自定义层直接执行前向传播计算。

linear(torch.rand(2, 5))

在这里插入图片描述
我们还可以使用自定义层构建模型,就像使用内置的全连接层一样使用自定义层。

net = nn.Sequential(MyLinear(64, 8), MyLinear(8, 1))
net(torch.rand(2, 64))

在这里插入图片描述
我们可以通过基本层类设计自定义层。这允许我们定义灵活的新层

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

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

相关文章

robosense 激光雷达安装

官方github 1、ROBOSENSE 驱动安装并运行 1、改雷达型号 2、修改网口地址 3、改变点的类型 https://github.com/RoboSense-LiDAR/rslidar_sdk/blob/main/doc/howto/05_how_to_change_point_type.md 2、ROBOSENSE 点云转换成 velodyne git clone https://github.com/HVikto…

Linux 部署 Harbor 镜像仓库详解

文章目录 安装 Docker安装 Harbor访问 Harbor 安装 Docker 本次部署流程使用的是1台阿里云ECS: Ubuntu 22.04,2核4G开放 9999 端口号 首先需要做的是在当前服务器上,安装好 Docker,参考链接如下: https://blog.csdn.n…

算法(四)前缀和

前缀和也是一个重要的算法,一般用来快速求静态数组的某一连续区间内所有数的和,效率很高,但不支持修改操作。分为一维前缀和、二维前缀和。 重要的前言! 不要死记模板,具体题目可能是前缀和、前缀乘积、后缀和、后缀乘…

qt 构建、执行qmake、运行、重新构建、清除

qt右键功能有 构建、执行qmake、运行、重新构建、清除,下面简单介绍一下各个模块的作用。 1. 执行qmake qmake是一个工具, 它根据pro文件生成makefile文件,而makefile文件中则定义编译与连接的规则。pro文件中定义了头文件,源文件…

【C++干货篇】——C/C++内存管理

【C干货篇】——C/C内存管理 文章目录 【C干货篇】——C/C内存管理1.C/C内存分布1.1静态区/数据段:1.2常量区/代码段:1.3栈:1.4堆:1.5. 内存映射区: 2.C语言中动态内存管理方式:malloc/calloc/realloc/free…

[笔记] 关于CreateProcessWithLogonW函数创建进程

函数介绍 https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-createprocesswithlogonw BOOL CreateProcessWithLogonW([in] LPCWSTR lpUsername,[in, optional] LPCWSTR lpDomain,[in] …

【lca,树上差分】P3128 [USACO15DEC] Max Flow P

题意 给定大小为 n ( 2 ≤ n ≤ 5 1 0 4 ) n(2 \leq n \leq 5 \times 10^4) n(2≤n≤5104) 的树,并给定 m ( 1 ≤ m ≤ 1 0 5 ) m(1 \leq m \leq 10^5) m(1≤m≤105) 条树上的路径(给定两个端点,容易证明两个点树上路径唯一)&…

分布式-单元化架构1

一 两地三中心 1.1 两地三中心* 两地指的是两个城市:同城,异地。三中心指的是三个数据中心:生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统,双中心具备相当的业务处理能力,…

【MySQL】索引的机制、使用

在学习索引知识之前,我们可以先了解一下什么是索引。实际上,索引就是数据库中一个或多个列存储的结构,能够支持数据库管理系统在不扫描整张表的情况下也能查询到数据行,能够大大提升查询效率。举个例子,我们想要找到一…

技术成神之路:设计模式(二十二)命令模式

相关文章:技术成神之路:二十三种设计模式(导航页) 介绍 命令模式(Command Pattern)是一种行为设计模式,允许将请求(命令)封装为对象,从而使您可以使用不同的请求、队列或记录请求日…

硬件基础知识补全计划【一】电阻

一、电阻理论 1.1 电流定义 电流:电流的强弱用电流强度来描述,电流强度是单位时间内通过导体某一横截面的电荷量,简称电流,用I表示。1 秒内有 6.241509310^18 个元电荷通过横截面的电流,定义为 1 安 (A)。 电压&…

【C++】在Windows中使用Boost库——实现TCP、UDP通信

目录 一、编译Boost库 二、TCP服务端 三、TCP客户端 四、UDP连接 一、编译Boost库 1. 先去官网下载Boost库源码 2. 点击下载最新的版本 下载Windows环境的压缩包,然后解压 3. 在解压后的目录路径下找到“bootstrap.bat” 打开控制台,在“bootstrap.…

Linux LCD 驱动实验

LCD 是很常用的一个外设,在裸机篇中我们讲解了如何编写 LCD 裸机驱动,在 Linux 下LCD 的使用更加广泛,再搭配 QT 这样的 GUI 库下可以制作出非常精美的 UI 界面。本章我们就来学习一下如何在 Linux 下驱动 LCD 屏幕。 Framebuffer 设备 先来…

ShardingSphere 分库分表入门实战

分库分表 需求分析 如果我们的平台发展迅速,用户量激增,从数据库层面去思考,哪个表的数据会最大呢? 回顾一下我们的数据库设计: 1)app 应用表 显然不会,成百上千的应用已经多,但…

ESP32移植Openharmony设备开发---(6)Mutex互斥锁

Mutex互斥锁 官方文档:OpenAtom OpenHarmony 基本概念 互斥锁又称互斥型信号量,用于实现对共享资源的独占式处理。当有任务持有时,这个任务获得该互斥锁的所有权。当该任务释放它时,任务失去该互斥锁的所有权。当一个任务持有互…

2024年最新苹果iOS证书申请创建App详细图文流程

iOS 证书设置指南: 对于开发者来说,在没有Mac电脑或对Xcode等开发工具不熟悉的情况下,如何快速完成IOS证书制作和IPA文件提交至开发者中心一直是一个难题。但是现在,有了初雪云提供的极简工具,您可以轻松实现这两个任…

Appium中的api(一)

目录 1.基础python代码准备 1--参数的一些说明 2--python内所要编写的代码 解释 2.如何获取包名和界面名 1-api 2-完整代码 代码解释 3.如何关闭驱动连接 4.安装卸载app 1--卸载 2--安装 5.判断app是否安装 6.将应用放到后台在切换为前台的时间 7.UIAutomatorViewer的使用 1--找…

git rebase的常用场景: 交互式变基, 变基和本地分支基于远端分支的变基

文章目录 作用应用场景场景一:交互式变基(合并同一条线上的提交记录) —— git rebase -i HEAD~2场景二:变基(合并分支) —— git rebase [其他分支名称]场景三:本地分支与远端分支的变基 作用 使git的提交记录变得更加简洁 应用场景 场景…

【华为HCIP实战课程十六】OSPF虚链路Vlink,网络工程师

一、vlink续 区域内部的路由优于区域之间的路由,区域之间优于外部路由,外部路由类型1优于外部类型2 只有同一级别的路由才会对比cost <R3>tracert 11.1.1.1 traceroute to 11.1.1.1(11.1.1.1), max hops: 30 ,packet length: 40,press CTRL_C to break 1 10.1.35.5 …

Wave-Mamba 论文总结

题目&#xff1a;Exchange&#xff08;交换&#xff09; Wave-Mamba: Wavelet State Space Model&#xff08;小波状态空间模型&#xff09;for Ultra-High-Definition&#xff08;超高清&#xff09;Low-Light Image Enhancement&#xff08;弱光图像增强&#xff09; 论文&am…