
[ML] Pytorch自学实战项目其3.2:超参数调优,估计车量Yawrate的RNN模型使用可视化工具TensorBoard&&HyperOpt调整超参数
本文为的后续笔记。之前整理了不同关于超参数的调整的内容,现在针对参数的调整,精简为参考该两篇文章,其中在Pytorch自学实战项目其3.0 中做过的调整继续保留,根据结果分析进行调整到本文为止,基本的处理就结束了,算是阶段性胜利,待训练一个周末后看结果决定下一步。
写在前面
本文为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)
更多推荐
所有评论(0)