1、nn.Module
torch.nn是专门为深度学习而设计的模块。torch.nn的核心数据结构是Module,它是一个抽象的概念,既可以表示神经网络中的某个层(layer),也可以表示一个包含很多层的神经网络。在实际使用中,最常见的做法是继承nn.Module,从而编写自己的网络/层。下面先来看看如何用nn.Module实现自己的全连接层。Y=AX+B
import torch as t
import torch.nn as nn
class network(nn.Module):
def __init__(self, input, output):
super().__init__()
# 定义权重矩阵a,它是一个可训练的参数,形状为(input, output)
self.a = nn.Parameter(t.randn(input, output))
# 定义偏置向量b,它也是一个可训练的参数,形状为(output,)
# 注意:偏置向量的长度应与输出特征的维度相匹配
self.b = nn.Parameter(t.randn(output))
def forward(self, x):
"""
定义前向传播过程
参数:
x (torch.Tensor): 输入数据,形状应为(batch_size, input)
返回:
torch.Tensor: 输出数据,形状为(batch_size, output)
"""
# 首先,使用权重矩阵a对输入x进行线性变换
# x@self.a执行矩阵乘法,x的每一行与a相乘,结果形状为(batch_size, output)
x = x @ self.a
# 然后,将偏置向量b扩展(通过broadcasting)到与x相同的形状,并加到x上
# self.b.expand_as(x)将b的形状从(output,)扩展到(batch_size, output)
# x + self.b.expand_as(x)将偏置加到每个样本的输出上
x = x + self.b.expand_as(x)
# 返回变换后的输出
return x
a = network(4, 3)
# 创建输入数据,形状为(6, 4),表示有6个样本,每个样本有4个特征
input = t.rand(6, 4)
# 通过网络前向传播得到输出
output = a(input)
# 打印输出,形状应为(6, 3),表示有6个样本,每个样本的输出特征维度为3
print(output)
- 自定义层network必须继承nn.Module,并且在其构造函数中需调用nn.Module的构造函数,即super().init()或nn.Mo