Pytorch nn.Module模块详解

torch.nn是专门为神经网络设计的模块化接口. nn构建于autograd之上,可以用来定义和运行神经网络。
nn.Module是nn中十分重要的类,包含网络各层的定义及forward方法

如何定义自己的网络:

  1. 需要继承nn.Module类,并实现forward方法。继承nn.Module类之后,在构造函数中要调用Module的构造函数, super(Linear, self).init()
  2. 一般把网络中具有可学习参数的层放在构造函数__init__()中。
  3. 不具有可学习参数的层(如ReLU)可放在构造函数中,也可不放在构造函数中(而在forward中使用nn.functional来代替)。可学习参数放在构造函数中,并且通过nn.Parameter()使参数以parameters(一种tensor,默认是自动求导)的形式存在Module中,并且通过parameters()或者named_parameters()以迭代器的方式返回可学习参数。
  4. 只要在nn.Module中定义了forward函数,backward函数就会被自动实现(利用Autograd)。而且一般不是显式的调用forward(layer.forward), 而是layer(input), 会自执行forward().
  5. 在forward中可以使用任何Variable支持的函数,毕竟在整个pytorch构建的图中,是Varible在流动。还可以使用if, for, print, log等python语法。

值得注意的是:
Pytorch基于nn.Module构建的模型中,只支持mini-batch的Variable输入方式。比如,只有一张输入图片,也需要变成NxCxHxW的形式:

input_image = torch.FloatTensor(1, 28, 28)
input_image = Variable(input_image)
input_image = input_image.unsq
### PyTorch `nn.MultiheadAttention` 类详解 #### 参数说明 `nn.MultiheadAttention` 是用于实现多头注意力机制的关键组件。该层接受多个输入张量并返回加权后的特征表示。 主要参数如下: - **embed_dim**: 表示每个位置的嵌入维度大小,即查询、键和值向量的最后一个维度。 - **num_heads**: 多头注意力中的头数。此数值决定了如何分割嵌入空间来计算不同的注意力分布[^1]。 - **dropout (optional)**: 默认为 0,在 Softmax 后应用 Dropout 层的概率。 - **bias (optional)**: 如果设为 False,则线性投影层不会带有偏置项,默认为 True。 - **add_bias_kv (optional)**: 若设置为True,则会额外添加可学习的偏差到键和值上,默认False。 - **add_zero_attn (optional)**: 是否加入全零的虚拟注意力权重,默认False。 - **kdim 和 vdim (optional)**: 键和值的特征维度;如果未指定则默认等于 embed_dim。 #### 使用实例 下面是一个简单的使用案例,展示了如何创建一个多头自注意机制,并将其应用于给定的数据集。 ```python import torch import torch.nn as nn class MultiHeadedSelfAttention(nn.Module): def __init__(self, d_model=512, n_heads=8): super(MultiHeadedSelfAttention, self).__init__() self.attn = nn.MultiheadAttention(embed_dim=d_model, num_heads=n_heads) def forward(self, query, key, value): attn_output, _ = self.attn(query=query, key=key, value=value) return attn_output # 创建模型实例 d_model = 512 n_heads = 8 batch_size = 32 seq_len = 10 model = MultiHeadedSelfAttention(d_model=d_model, n_heads=n_heads) # 构建随机输入数据 query = torch.randn((seq_len, batch_size, d_model)) key = torch.randn((seq_len, batch_size, d_model)) value = torch.randn((seq_len, batch_size, d_model)) output = model.forward(query=query, key=key, value=value) print(output.shape) # 输出形状应为(seq_len, batch_size, d_model)[^2] ``` 上述代码定义了一个基于 `MultiheadAttention` 的简单自注意力网络结构,并通过构建一批假数据进行了前向传播操作验证其功能正常工作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值