ziyi-lstm-train代码

发布时间 2023-04-18 09:43:45作者: 辛宣

lstm的train代码


def train_lstm(net,lr,train_loader,total_epoch):
    global_step = 1
    optimizer = torch.optim.Adam(net.parameters(), lr=lr)
    scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[i for i in range(0, 500, 150)][1:], gamma=0.05)
    loss_func = torch.nn.MSELoss()
    loss_metrics = AverageValueMeter()
    # with torch.no_grad():
    ########## training set##########
    for epoch in range(total_epoch):
        epoch_loss = 0
        for step, (x, y) in tqdm(enumerate(train_loader)):
            print(x.shape)
            output = net(x)
            print(output.shape)
            ##########加mask训练
            loadData = np.load('A.npy')
            loadData = torch.tensor(loadData.reshape(loadData.shape[0] * loadData.shape[1]),
                                    dtype=torch.float32).cuda()
            output = output * loadData
            y = y * loadData
            ##########
            train_loss = loss_func(output, y)
            optimizer.zero_grad()
            train_loss.backward()
            optimizer.step()
            global_step = global_step + 1
            epoch_loss += train_loss.item()
            loss_metrics.add(train_loss.item())
        print("[epcho {}]:loss {}".format(epoch, loss_metrics.value()[0]))
        loss_metrics.reset()
        scheduler.step()
    return net

for step, (x, y) in tqdm(enumerate(train_loader)):

enumerate函数来迭代遍历train_loader中的每个批次(batch)的数据,x表示输入数据,y表示标签数据

train_loader是一个数据加载器对象,通常用于从训练数据中加载批次的输入(x)和标签(y),以供模型进行训练。

tqdm是一个Python库,用于在循环中显示进度条

在每次迭代中,x和y将被传递给net模型进行前向传播和计算损失,然后通过优化器进行反向传播和参数更新,从而实现对LSTM模型的训练

optimizer = torch.optim.Adam(net.parameters(), lr=lr) 是用于创建一个Adam优化器对象,用于在模型训练过程中更新模型的参数。

scheduler = lr_scheduler.MultiStepLR(optimizer, milestones=[i for i in range(0, 500, 150)][1:], gamma=0.05)

是用于创建一个多步长学习率调整器(scheduler)对象,用于在模型训练过程中动态调整学习率

这里通过[i for i in range(0, 500, 150)][1:]用于生成一个从 0 到 500(不包括 500)的列表,并按照步长 150 进行间隔。

loss_metrics = AverageValueMeter()

loss_metrics = AverageValueMeter() 是用于创建一个用于计算平均值的指标(metric)对象。AverageValueMeter 是 PyTorch 提供的一个用于计算平均值的指标对象,它可以在每次迭代中接收一个新的数值,并计算累积的平均值

通过 loss_metrics.add(train_loss.item()) 将每次迭代的损失函数值添加到 loss_metrics 中,然后通过 loss_metrics.value() 可以获取当前的平均值,用于监控训练过程中损失函数的变化情况。

scheduler.step()

scheduler.step() 是调用 PyTorch 中的学习率调整器(LR scheduler)的方法,用于更新优化器中的学习率。

在示例中,使用了 MultiStepLR 学习率调整器,它在每个指定的里程碑(milestones)处更新学习率,通过调用 scheduler.step() 来更新学习率的值。

global_step = 1

global_step = 1 是设置一个全局步数(global step)的初始值。在训练神经网络模型时,每一次参数更新的过程通常被称为一个步(step)。global_step 变量用于记录全局步数,通常在每次参数更新时会递增,以便在训练过程中进行计数

MSE Loss

是一种常用的回归问题损失函数,用于度量模型输出与真实标签之间的平均平方误差。、、在每次训练迭代中,通过计算模型的输出与真实标签之间的均方误差来计算损失,并用该损失来进行反向传播和优化器更新参数。

LSTM(10140, 3380, batch_first=True)

  • 10140:输入特征的维度,即输入数据的特征向量的长度。

  • 3380:隐藏状态的维度,即 LSTM 模型内部的隐藏状态向量的长度。

  • batch_first=True:指定输入数据的维度顺序,将批次维度放在第一维度。如果设置为 False,则输入数据的维度顺序为 (sequence_length, batch_size, input_size),默认为 False

    这段代码定义了一个具有 10140 个输入特征、隐藏状态维度为 3380 的 LSTM 模型,并将输入数据的批次维度放在第一维度。batch_first=True 可以使得输入数据的维度顺序为 (batch_size, sequence_length, input_size),这在很多情况下更加直观和方便。

    return net

    return net 是函数 train_lstm 的返回值。

    返回训练后的模型是函数的一种常见做法,因为在训练过程中,模型的参数会被不断更新以逐渐优化模型的性能。一旦训练完成,将训练后的模型返回给调用者,可以使调用者在后续的应用中使用该模型进行预测、推理等任务

    这里的net 就是mylstm模型。也就是:

    myLSTM(
    (lstm): LSTM(10140, 3380, batch_first=True)
    (dense): Linear(in_features=3380, out_features=3380, bias=True)
    )

    global_step = 1

    全局步数。epoch_loss 用于计算每个 epoch 的损失,而 global_step 则用于记录训练过程中的全局步数。

loadData = torch.tensor(loadData.reshape(loadData.shape[0] * loadData.shape[1]),dtype=torch.float32).cuda()

  1. loadData.reshape(loadData.shape[0] * loadData.shape[1])loadData 的形状进行改变,将其转换为一个一维张量。这里使用了 NumPy 的 reshape() 方法,将 loadData 的形状从二维(或更高维)变为一维,长度为 loadData.shape[0] * loadData.shape[1]
  2. torch.tensor(..., dtype=torch.float32) 将上一步得到的一维 NumPy 数组转换为 PyTorch 的张量,并指定其数据类型为 torch.float32,即单精度浮点数。
  3. .cuda() 将张量移动到 GPU 上进行计算。这里使用了 PyTorch 的 .cuda() 方法,将张量从 CPU 内存移动到 GPU 内存,以便在 GPU 上进行计算。

掩码(mask)

在深度学习中,掩码(mask)通常是一个与输入数据形状相同的二进制张量,用于对输入数据进行逐元素的屏蔽或加权操作。掩码中的值为0或1,用于控制对应位置的输入数据是否参与计算。

output = output * loadData

这里的目的可能是对 output 进行按元素乘法,使用 loadData 作为掩码(mask),将 output 中对应位置的值与 loadData 中对应位置的值相乘,从而实现对 output 进行部分元素的屏蔽或加权。

convlstm-lr的模型和convlstm-conv的模型有啥区别

convlstm-lrconvlstm-conv 分别指代了两种不同的 ConvLSTM 模型,其区别主要体现在网络结构和输入特征的处理方式上。

  1. convlstm-lr: 这种模型在输入特征的处理上,直接将原始的输入特征作为 ConvLSTM 模型的输入。ConvLSTM 是一种结合了卷积神经网络(Convolutional Neural Network, CNN)和长短时记忆网络(Long Short-Term Memory, LSTM)的混合网络结构,可以对序列数据进行建模。convlstm-lr 模型直接在输入特征上应用卷积操作,并通过 LSTM 单元对卷积输出进行时序建模,从而融合了卷积和循环的特性。
  2. convlstm-conv: 这种模型在输入特征的处理上,先使用卷积神经网络对输入特征进行特征提取,然后再将提取的特征输入到 ConvLSTM 模型中。与 convlstm-lr 不同,convlstm-conv 模型在输入特征上应用了卷积操作,将输入特征转换为高层次的抽象特征表示,然后再通过 ConvLSTM 进行时序建模,从而在卷积和循环的结合上有所调整。

为啥是return net

这里的net就是mylstm。

返回训练后的模型是函数的一种常见做法,因为在训练过程中,模型的参数会被不断更新以逐渐优化模型的性能。一旦训练完成,将训练后的模型返回给调用者,可以使调用者在后续的应用中使用该模型进行预测、推理等任务。

在给定的代码中,train_lstm 函数通过训练输入的 LSTM 模型 net,并返回经过训练后的模型 net。调用该函数时,可以通过接收返回的模型,并对其进行进一步的操作,比如保存模型参数、使用模型进行预测等

threshold = torch.nn.Threshold(0., 0.0)是啥意思

threshold 是 PyTorch 中的一个激活函数,其作用是将输入张量的值进行阈值化处理。

具体而言,threshold 函数的输入是一个张量,其中包含了待处理的数值。函数会将输入张量中小于指定阈值的值设置为0,而大于等于阈值的值保持不变。

LSTM(10140, 3380, batch_first=True)

其中的参数含义如下:

  • 10140:输入特征的维度,即输入数据的特征向量的长度。
  • 3380:隐藏状态的维度,即 LSTM 模型内部的隐藏状态向量的长度。
  • batch_first=True:指定输入数据的维度顺序,将批次维度放在第一维度。如果设置为 False,则输入数据的维度顺序为 (sequence_length, batch_size, input_size),默认为 False

dataset = Data.TensorDataset(features_train, label_train);是啥意思

这段代码的作用是创建一个 PyTorch 的 TensorDataset 数据集对象,用于将训练数据 features_train 和对应的标签 label_train 组合在一起,以便于后续的数据加载和处理。