• pytorch - RNN参数详解


    在使用 PyTorch 训练循环神经网络(RNN)时,需要了解相关类和方法的每个参数及其含义。以下是主要的类和方法,以及它们的参数和作用:

    1. torch.nn.RNN

    这是 PyTorch 中用于定义简单循环神经网络(RNN)的类。

    主要参数:

    • input_size:输入特征的维度。
    • hidden_size:隐藏层特征的维度。
    • num_layers:RNN 层的数量。
    • nonlinearity:非线性激活函数,可以是 ‘tanh’ 或 ‘relu’。
    • bias:是否使用偏置,默认为 True
    • batch_first:如果为 True,输入和输出的第一个维度将是 batch size,默认为 False
    • dropout:除最后一层外的层之间的 dropout 概率,默认为 0。
    • bidirectional:是否为双向 RNN,默认为 False

    2. torch.nn.LSTM

    这是 PyTorch 中用于定义长短期记忆网络(LSTM)的类。

    主要参数:

    • input_size:输入特征的维度。
    • hidden_size:隐藏层特征的维度。
    • num_layers:LSTM 层的数量。
    • bias:是否使用偏置,默认为 True
    • batch_first:如果为 True,输入和输出的第一个维度将是 batch size,默认为 False
    • dropout:除最后一层外的层之间的 dropout 概率,默认为 0。
    • bidirectional:是否为双向 LSTM,默认为 False

    3. torch.nn.GRU

    这是 PyTorch 中用于定义门控循环单元(GRU)的类。

    主要参数:

    • input_size:输入特征的维度。
    • hidden_size:隐藏层特征的维度。
    • num_layers:GRU 层的数量。
    • bias:是否使用偏置,默认为 True
    • batch_first:如果为 True,输入和输出的第一个维度将是 batch size,默认为 False
    • dropout:除最后一层外的层之间的 dropout 概率,默认为 0。
    • bidirectional:是否为双向 GRU,默认为 False

    4. torch.optim 优化器

    PyTorch 提供了多种优化器,用于调整模型参数以最小化损失函数。

    常用优化器:

    • torch.optim.SGD:随机梯度下降优化器。

      • params:要优化的参数。
      • lr:学习率。
      • momentum:动量因子,默认为 0。
      • weight_decay:权重衰减(L2 惩罚),默认为 0。
      • dampening:动量阻尼因子,默认为 0。
      • nesterov:是否使用 Nesterov 动量,默认为 False
    • torch.optim.Adam:Adam 优化器。

      • params:要优化的参数。
      • lr:学习率,默认为 1e-3。
      • betas:两个系数,用于计算梯度和梯度平方的移动平均值,默认为 (0.9, 0.999)。
      • eps:数值稳定性的项,默认为 1e-8。
      • weight_decay:权重衰减(L2 惩罚),默认为 0。
      • amsgrad:是否使用 AMSGrad 变体,默认为 False

    5. torch.nn.CrossEntropyLoss

    这是 PyTorch 中用于多分类任务的损失函数。

    主要参数:

    • weight:每个类别的权重,形状为 [C],其中 C 是类别数。
    • size_average:是否对损失求平均,默认为 True
    • ignore_index:如果指定,则忽略该类别的标签。
    • reduce:是否对批次中的损失求和,默认为 True
    • reduction:指定应用于输出的降维方式,可以是 ‘none’、‘mean’、‘sum’。

    6. torch.utils.data.DataLoader

    这是 PyTorch 中用于加载数据的工具。

    主要参数:

    • dataset:要加载的数据集。
    • batch_size:每个批次的大小。
    • shuffle:是否在每个 epoch 开始时打乱数据,默认为 False
    • sampler:定义从数据集中采样的策略。
    • batch_sampler:与 sampler 类似,但一次返回一个批次的索引。
    • num_workers:加载数据时使用的子进程数,默认为 0。
    • collate_fn:如何将样本列表合并成一个 mini-batch。
    • pin_memory:是否将数据加载到固定内存中,默认为 False
    • drop_last:如果数据大小不能被 batch size 整除,是否丢弃最后一个不完整的批次,默认为 False

    示例代码

    下面是一个使用 LSTM 训练简单分类任务的示例代码:

    import torch
    import torch.nn as nn
    import torch.optim as optim
    from torch.utils.data import DataLoader, TensorDataset
    
    # 定义模型
    class LSTMModel(nn.Module):
        def __init__(self, input_size, hidden_size, num_layers, num_classes):
            super(LSTMModel, self).__init__()
            self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
            self.fc = nn.Linear(hidden_size, num_classes)
    
        def forward(self, x):
            h0 = torch.zeros(num_layers, x.size(0), hidden_size).to(device)
            c0 = torch.zeros(num_layers, x.size(0), hidden_size).to(device)
            out, _ = self.lstm(x, (h0, c0))
            out = self.fc(out[:, -1, :])
            return out
    
    # 参数设置
    input_size = 28
    hidden_size = 128
    num_layers = 2
    num_classes = 10
    num_epochs = 2
    batch_size = 100
    learning_rate = 0.001
    
    # 数据准备
    train_dataset = TensorDataset(train_x, train_y)
    train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
    
    # 模型初始化
    model = LSTMModel(input_size, hidden_size, num_layers, num_classes).to(device)
    
    # 损失函数和优化器
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
    
    # 训练模型
    for epoch in range(num_epochs):
        for i, (images, labels) in enumerate(train_loader):
            images = images.reshape(-1, sequence_length, input_size).to(device)
            labels = labels.to(device)
    
            # 前向传播
            outputs = model(images)
            loss = criterion(outputs, labels)
    
            # 反向传播和优化
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
    
            if (i+1) % 100 == 0:
                print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{total_step}], Loss: {loss.item():.4f}')
    

    这个示例代码展示了如何使用 PyTorch 定义和训练一个 LSTM 模型,并详细解释了每个类和方法的参数及其作用。

    更多问题咨询

    CosAI

  • 相关阅读:
    java 短路运算符用法 和 短路运算符的好处
    CSS利用定位+margin实现元素居中
    解密Prompt系列11. 小模型也能COT-先天不足后天来补
    Vue2或Vue3使用Pinia快速入门
    读书笔记:多Transformer的双向编码器表示法(Bert)-3
    Vue中this.$set()解决页面不更新问题
    IC验证覆盖率
    基于mindspore的大模型llama2-7b---微调/推理
    无代码开发Webhook入门教程
    MySQL 主从复制与读写分离
  • 原文地址:https://blog.csdn.net/weixin_47552266/article/details/139754630