[ML] Pytorch自学实战项目其3.2:超参数调优,估计车量Yawrate的RNN模型使用可视化工具TensorBoard&&HyperOpt调整超参数

写在前面

本文为Pytorch自学实战项目其3.1:超参数调优 可视化工具TensorBoard用实际例子从零开始使用的后续笔记。

之前整理了不同关于超参数的调整的内容,现在针对参数的调整,精简为参考该两篇文章,其中在Pytorch自学实战项目其3.0 中做过的调整继续保留,根据结果分析进行调整

更新

为TB的变更

按照上一节的过程针对我在https://blog.csdn.net/weixin_46479223/article/details/134054330
的模型作出修改,同时也改正了一些print和标注的错误。
大概思路如下:

在这里插入图片描述
结果如下:
在这里插入图片描述

训练时候的显卡情况,看起来还有能力继续加大batch_size在这里插入图片描述

简要分析

Trainling Loss 看起来比较正常 根据看起来Training loss来看,加大Epoch和Batch_size 会有正面收益

在这里插入图片描述

Test Loss 看起来完全没有在收敛,虽然也是大Epoch和Batch_size的表现好一些
在这里插入图片描述检查test 阶段是不是模型orloss设置有错误,把test数据替换成train的数据,结果看起来正常了,所以还是数据本身选取问题
在这里插入图片描述

然后观察到我的数据里有很多如下的数据,尤其是在test集合里
在这里插入图片描述控制请求内部量是一直计算的,但是这时候没有在控车,所以实际上车辆是人在开,并不符合要训练的拟合函数。大量的类似不合理的数据造成了错误(因为我当时是从一段数据结尾选取的大约10万行/9features 也就是200s左右的数据没想到这200s是人再开车)

于是重新整理数据,去除掉了控车指令作为特征(以后有机会我再去录制,控车且不overide的)并根据以上经验调大了batch_size,看起来testloss 合理多了,但是下降的目前还是比train的loss慢。
在这里插入图片描述

关于我的数据的走势,其实并不符合过拟合后test loss反升,test loss 也没有迅速进一步下降,目前数据也仅排除了控车干扰(直接从传感器实际输入到车身状态)。

询问GPT:
Q:过拟合的话loss不是会上升吗,我的testloss只是振荡但是并没有上升,整体表现是test的loss下降到一定程度之后不下降了并且比training的loss要大

A:
您的观察很重要。如果测试集的损失在一定水平上震荡但没有明显上升,这可能不是典型的过拟合。在这种情况下,可以考虑以下几个方面:

震荡的原因:学习率可能过高。当学习率太高时,模型在试图最小化损失函数时可能会在最小值附近震荡,而无法准确收敛。

局部最小值或鞍点:模型可能陷入局部最小值或鞍点,这使得损失函数难以进一步降低。

模型容量:如果模型的容量(即模型的复杂度或能力)不足以捕获数据中的全部复杂性,那么即使训练更长时间,测试集的损失也可能不会进一步显著下降。

数据问题:如果测试数据中包含噪声或异常值,这也可能导致损失函数震荡。

针对这些情况,您可以尝试以下策略:

调整学习率:尝试逐渐降低学习率,看是否能减少震荡并促进更好的收敛。

使用学习率衰减:随着训练的进行,逐渐减小学习率,这有助于微调模型参数并避免过度震荡。

动量或优化器调整:使用带有动量的优化器,如Adam或RMSprop,可以帮助跳出局部最小值或鞍点。

增加模型容量:如果怀疑模型容量不足,可以尝试增加更多的层或神经元。

数据清洗和预处理:确保测试集数据的质量,移除噪声和异常值。

更细粒度的调整:在超参数调整时,尝试更细粒度的调整而不是大幅度改变。

模型正则化:虽然不是典型的过拟合情况,但适度的正则化(如dropout)有时也可以帮助模型更好地泛化。

学习率调度器:使用学习率调度器,在训练过程中根据预定策略调整学习率。

这里是引用

他的回答里:我已经使用了adam,使用了dropout。

我继续调整加大batch_size 和观察一下更长的Epoch,并且加上动态学习率
实验6的参数组合为
log_dir=‘runs/RNNdemo_experiment_6’
learning_rate = 1e-3
batch_size_list = [64,128,256]
epochs_list=[100,200,500]
(optimizer, step_size=50, gamma=0.9)

在这里插入图片描述在这里插入图片描述看起来loss确实是在持续下降的只不过速度比较慢,远远没有过拟合 :1.epoch大 test loss 下降快,2. batch_size大 开始loss大,但是随着训练epoch加大,后续epoch到一定程度效果会反转,batchsize大的会开始更好,如下图在这里插入图片描述最后也会更好一些
在这里插入图片描述

计划先持续训练一个周末看一下loss曲线变化
在这里插入图片描述鉴于显卡能力很富裕,我加大batch_size(但太大的话我的数据不够了)

实验7的参数组合为
log_dir=‘runs/RNNdemo_experiment_7’
learning_rate = 1e-3
batch_size_list = [128,256,512]
epochs_list=[20000]
scheduler = StepLR(optimizer, step_size=500, gamma=0.9)

后续我的考虑是

  • 可以加大数据的sequence_length,目前是0.02*5=0.1s.我如果使用25,则是用前0.5s的数据来作预测。
  • 看看是否有必要加深网络结构 捕捉更多信息
  • 下一次有时间重新录制试车数据,更长且车在控制

部分函数代码

#main
            # Debuging Dataform
            for data_batch, label_batch in data_loader_training:
                print(f"Shape of data_batch: {data_batch.shape}")#(16,5,9)

                for data, label in zip(data_batch, label_batch):
                    print(f"Shape of data: {data.shape}")# (5,9)
                    print(f"Shape of label: {label.shape} {label.dtype}")#(1,7)
                    # for dat in data:
                    #     print(f"data: {dat}")
                    break
                break 
            # #hidden_prev init
            # hidden_prev = torch.zeros(1, 16, 32)
            for iter in range(epochs):
                print(f'_________________Epoch:{iter+1}/{epochs}_______________________')
                train_RNN(data_loader_training, model, loss_fn, optimizer, iter,writer,device)
                test_RNN(data_loader_valid, model, loss_fn, iter, writer,device)
                scheduler.step()
            # saving model 
            torch.save(model.state_dict(), f'VehicalStateperML_RNN_epochs_{epochs}_BS:{batch_size}.pth')
            print(f'Finished with epochs :{epochs} ,BS:{batch_size}')
            # 关闭writer
            writer.close()
#test
def test_RNN(dataloader, model, loss_fn,iter,writer,device):
    # Set the model to evaluation mode - important for batch normalization and dropout layers
    model.eval()
    size = len(dataloader.dataset) # before batch operation
  
    num_batches = len(dataloader) #after batch operation
    #print(f"size: {size} and num_batches {num_batches}")
    test_loss,Epoch_loss = 0.0,0.0
    # first loss flag 
    loss_flag= False 
    # # Evaluating the model with torch.no_grad() ensures that no gradients are computed during test mode
    # # also serves to reduce unnecessary gradient computations and memory usage for tensors with requires_grad=True
    with torch.no_grad():
         for batch, (X, y) in enumerate(dataloader):
            X = X.to(device)  # 将数据移到设备上
            y = y.to(device) 
            batch_size=X.size(0)
            hidden_prev = torch.zeros(1, batch_size, 32,dtype=X.dtype)
            hidden_prev = hidden_prev.to(device)  
            pred,_ = model(X,hidden_prev)
            loss_test=loss_fn(pred, y)
            test_loss += loss_test.item()
            Epoch_loss += loss_test.item()
            cycle2Out=50
    #       #correct += (pred.argmax(1) == y).type(torch.float).sum().item()
            if batch % cycle2Out == 0:# set print frequenz
                if (False==loss_flag):
                    loss_flag=True
                else:# set print frequenz
                    #current = (batch + 1) * len(X)
                    #print(f"average test loss of {cycle2Out} batches: {(test_loss/cycle2Out):>7f}  [{current:>5d}/{size:>5d}]")
                    writer.add_scalar(f'average test loss of {cycle2Out} batches :', test_loss/cycle2Out , iter * num_batches + batch+1)
                    test_loss=0.0
    print("_________________________________________")
    print(f"test loss {iter+1}. Epoch: {Epoch_loss/num_batches:>8f} \n")
    writer.add_scalar('test loss per Epoch View', Epoch_loss/num_batches , iter+1)
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值