news 2026/7/4 12:23:45

深度学习模型构建与管理:深度学习框架中的自定义层设计与实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度学习模型构建与管理:深度学习框架中的自定义层设计与实践

深度学习中的自定义层

学习目标

本课程通过介绍如何在不同的深度学习框架中创建自定义层,包括不带参数和带参数的层,强调了神经网络架构设计的灵活性和创造性。

相关知识点

  • 自定义不带参数的层
  • 自定义带参数的层

学习内容

深度学习成功背后的一个因素是神经网络的灵活性:我们可以用创造性的方式组合不同的层,从而设计出适用于各种任务的架构。例如,研究人员发明了专门用于处理图像、文本、序列数据和执行动态规划的层。有时我们会遇到或要自己发明一个现在在深度学习框架中还不存在的层。在这些情况下,必须构建自定义层。本课程将展示如何构建自定义层。

1 自定义不带参数的层

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

importtorchimporttorch.nn.functionalasFfromtorchimportnnclassCenteredLayer(nn.Module):def__init__(self):super().__init__()defforward(self,X):returnX-X.mean()

让我们向该层提供一些数据,验证它是否能按预期工作。

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

out:
tensor([-2., -1., 0., 1., 2.])
现在,我们可以将层作为组件合并到更复杂的模型中。

net=nn.Sequential(nn.Linear(8,128),CenteredLayer())

作为额外的健全性检查,我们可以在向该网络发送随机数据后,检查均值是否为0。由于我们处理的是浮点数,因为存储精度的原因,我们仍然可能会看到一个非常小的非零数。

Y=net(torch.rand(4,8))Y.mean()

out:
tensor(-3.7253e-09, grad_fn=)

2 自定义带参数的层

以上我们知道了如何定义简单的层,下面我们继续定义具有参数的层,这些参数可以通过训练进行调整。我们可以使用内置函数来创建参数,这些函数提供一些基本的管理功能。比如管理访问、初始化、共享、保存和加载模型参数。这样做的好处之一是:我们不需要为每个自定义层编写自定义的序列化程序。

现在,让我们实现自定义版本的全连接层。回想一下,该层需要两个参数,一个用于表示权重,另一个用于表示偏置项。在此实现中,我们使用修正线性单元作为激活函数。该层需要输入参数:in_unitsunits,分别表示输入数和输出数。

classMyLinear(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,))defforward(self,X):linear=torch.matmul(X,self.weight.data)+self.bias.datareturnF.relu(linear)

接下来,我们实例化MyLinear类并访问其模型参数。

linear=MyLinear(5,3)linear.weight

out:

Parameter containing: tensor([[-0.3066, -0.4875, 1.1198], [-0.0376, -0.1592, 0.9241], [ 0.4258, 0.1886, 0.5486], [ 1.1076, -0.3592, 0.2439], [-1.4562, 1.7751, -0.7615]], requires_grad=True)

我们可以使用自定义层直接执行前向传播计算。

linear(torch.rand(2,5))

out:
tensor([[0.0000, 2.1028, 0.5063],
[0.5512, 0.7219, 1.5128]])

我们还可以使用自定义层构建模型,就像使用内置的全连接层一样使用自定义层。

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

out:

tensor([[8.9254], [8.4826]])
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 15:18:24

【C#不安全代码深度解析】:掌握指针与别名定义的高效编程技巧

第一章:C#不安全代码的引入与意义在高性能计算、系统底层开发或与非托管代码交互的场景中,C# 提供了对“不安全代码”的支持,允许开发者直接操作内存地址和使用指针。这种能力突破了 .NET 运行时默认的安全限制,为需要极致性能或硬…

作者头像 李华
网站建设 2026/7/1 22:46:25

YOLOv8目标检测实战:从零搭建GPU环境并加速模型训练

YOLOv8目标检测实战:从零搭建GPU环境并加速模型训练 在智能监控、工业质检和自动驾驶等现实场景中,目标检测早已不再是实验室里的概念玩具。面对日益增长的部署需求,开发者最常遇到的问题不是“怎么改网络结构”,而是——为什么我…

作者头像 李华
网站建设 2026/7/1 20:54:54

正规的金包银排行榜

目前并没有官方统一且权威的正规金包银排行榜。金包银市场品牌众多,由于缺乏统一的评判标准和权威机构进行排名,很难有一个被广泛认可的排行榜。不过,在金包银领域,六六珠宝是一家值得关注的品牌。六六珠宝位于河北省衡水市景县&a…

作者头像 李华