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()
loadData.reshape(loadData.shape[0] * loadData.shape[1])
将loadData
的形状进行改变,将其转换为一个一维张量。这里使用了 NumPy 的reshape()
方法,将loadData
的形状从二维(或更高维)变为一维,长度为loadData.shape[0] * loadData.shape[1]
。torch.tensor(..., dtype=torch.float32)
将上一步得到的一维 NumPy 数组转换为 PyTorch 的张量,并指定其数据类型为torch.float32
,即单精度浮点数。.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-lr
和 convlstm-conv
分别指代了两种不同的 ConvLSTM 模型,其区别主要体现在网络结构和输入特征的处理方式上。
convlstm-lr
: 这种模型在输入特征的处理上,直接将原始的输入特征作为 ConvLSTM 模型的输入。ConvLSTM 是一种结合了卷积神经网络(Convolutional Neural Network, CNN)和长短时记忆网络(Long Short-Term Memory, LSTM)的混合网络结构,可以对序列数据进行建模。convlstm-lr
模型直接在输入特征上应用卷积操作,并通过 LSTM 单元对卷积输出进行时序建模,从而融合了卷积和循环的特性。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
组合在一起,以便于后续的数据加载和处理。