https://www.pianshen.com/article/16621212014/
https://zhuanlan.zhihu.com/p/339448370
https://zhuanlan.zhihu.com/p/339448370
https://blog.csdn.net/qiusuoxiaozi/article/details/72851656
https://zhuanlan.zhihu.com/p/69411064
https://www.jianshu.com/p/26a7dbc15246
https://zhuanlan.zhihu.com/p/104992391
https://zhuanlan.zhihu.com/p/89419960
https://zhuanlan.zhihu.com/p/265021958
https://www.zhihu.com/question/65305385/answer/641705098
https://www.zhihu.com/question/25097993/answer/934100939
https://www.zhihu.com/question/35577148/answer/63837608
https://zhuanlan.zhihu.com/p/64864995
一个epoch 就是指你数据集里所有数据全过一遍…batch size是指你一次性拿多少个数据去训练…比如你一共有一万个数据点…batch size是200…那么你就要训练50次才是一个epoch…具体要多少个epoch看情况吧…太大缺点有两个…一个是过拟合(overfit)另一个是训练时间太长
https://www.zhihu.com/question/64134994/answer/216895968
听说GPU对2的幂次的batch可以发挥更佳的性能,因此设置成16、32、64、128
https://zhuanlan.zhihu.com/p/88340684
使用大batch有哪些优势?(即小batch的劣势)
使用大batch有哪些劣势?
随着batch normalization的普及,收敛速度已经不像前bn时代一样需要非常玄学的调参,现在一般都还是采取大batch size,毕竟GPU友好嘛,高票答案说的batch size大了一个epoch update数量少了的这个缺点在bn面前似乎也没太多存在感了。不过bn的坏处就是不能用太小的batch size,要不然mean和variance就偏了。所以现在一般是显存能放多少就放多少。而且实际调起模型来,真的是数据分布和预处理更为重要,数据不行的话 玩再多花招也没用
1 大的batchsize减少训练时间,提高稳定性
2 过分大的batchsize如 8k (不可能用。。)导致模型泛化能力下降
尽量使用大的学习率,因为很多研究都表明更大的学习率有利于提高泛化能力。如果真的要衰减,可以尝试其他办法,比如增加batch size,学习率对模型的收敛影响真的很大,慎重调整
个人经验 以128为中间向上向下 2倍尝试
本文通过实验证明,在大规模训练中,对于给定的计算资源,使用小批量可以更好地保证模型的通用性和训练稳定性。在大多数情况下,batch size小于等于32时模型的最终性能较优,而当batch size=2或4时,模型性能可能会达到最优。
如果要进行batch归一化处理,或者使用的是大型数据集,这时我们也可以用较大的batch,比如32和64。但要注意一点,为了保证训练效率,这些数据最好是分布式处理的,比如最好的方法是在多个处理器上分别做BN和随机梯度优化,这样做的优势是对于单个处理器而言,这其实还是在做小批量优化。而且根据文章的实验,BN的最优batch size通常比SGD的还要小。
https://zhuanlan.zhihu.com/p/36404180
归一化的问题:也是一个无固定解的问题;就个人的经验而言大部分情况下归一化比不归一化要好,但是也存在一些特别的数据集,不归一化的情况下反而结果会更好;至于两种归一化方法感觉旗鼓相当了,从经验来说基于最大最小值的[0,1]归一化要稍微好一些。但是图像数据一定要归一化,不归一化结果很烂。所以最终是否归一化,选择哪种归一化方法需要题主用实验来验证你的数据适合哪种情况。
https://www.zhihu.com/question/47908908/answer/112468487
20201223 下午 kitti19 训练不到一小时,可视化结果很差,没有学到东西,train loss在0.58 test loss在0.72,不知过拟合还是
20201224 晚上,调整临尺寸 224 -》resize 到640 192 VGG 和FCN 都加了一层,最后的最小输出f map大小为10×3,SGM改 ADAM,加了loss绘图, 数据为 全部12000 kitti
20201226 第三次完成, 测了一下 kitti的效果大概ok吧因为是 训练集 ,然后在apollo测了一下,环境不太一样, 所以除了地面还比较整齐,其他有些乱
在kitti 的 epoch 2的效果?? 其实已经和 epoch200 接近了? 原谅我把 epoch20以后存的权重都删了重新训。。
kitti 19
apollo:
第四次 用SGD 训400 epoch 尝试看到 test loss的上升 验证 early stop
设置optim如下
criterion= nn.MSELoss() # regression
optimizer= optim.SGD(fcn.parameters(), lr= 0.001, momentum= 0.9)
# optimizer = optim.Adam(fcn.parameters(), lr=0.001, betas=(0.9, 0.999))
scheduler= optim.lr_scheduler.StepLR(optimizer, 40, gamma=0.5)
1228训练结束 效果很迷 很浅 和第一次 resize224 效果有点像,是后期学习率太小了 没有学到东西的感觉
loss也可以看到 后期 下降太小, 也看不到test loss 上升的过程, 无法验证early stop的过程。
https://www.zhihu.com/question/58200555/answer/621174180
https://zhuanlan.zhihu.com/p/48426076
https://zhuanlan.zhihu.com/p/188323684
读取jpg图片加速、 预读取
https://zhuanlan.zhihu.com/p/68191407
BN层的输出Y与输入X之间的关系是:Y = (X - running_mean) / sqrt(running_var + eps) * gamma + beta,此不赘言。其中gamma、beta为可学习参数(在pytorch中分别改叫weight和bias)
https://zhuanlan.zhihu.com/p/102710590
https://blog.csdn.net/jzwong/article/details/104272600
https://blog.csdn.net/qq_38765642/article/details/109779370
如果存在全连接层,输入尺寸固定,因为fc定好了
全卷积网络没有这个问题,但是batch要求图片大小需要统一,分布多卡似乎可以不同batch的图大小不一样
解决尺度的问题:前面使用SPP、gap 代替 fc、自适应pooling
比如kitti 1240 370 可以直接进backbone,但是计算量会比较大,可以resize或者 crop,但是要保比, 比如 620:185,并且计算量和 backbone的一般输入的计算量一致
主要模块: SPP 融合特征, 代价匹聚合:basic 3D CNN 输出一层回归 或者 堆叠沙漏 输出三层回归视差。
输入尺寸的处理:
图片大小为375 * 1242,训练时将图片随机裁剪至256 * 512的大小,再进行均值为[0.485, 0.456, 0.406],标准差为[0.229, 0.224, 0.225]的标准化。对于读入的视差ground truth,将视差缩小256倍,因为原来视差范围很大。
验证或预测时 若全图比较,考虑卷积神经网络对图片矩阵的一些缩放问题,先将原图裁剪至368*1232,输入网络得到视差图,再填充至原图大小。
https://blog.csdn.net/qq_39938666/article/details/90794240
https://blog.csdn.net/qq_40859802/article/details/103903807
https://blog.csdn.net/weixin_43812609/article/details/109479705
https://zhuanlan.zhihu.com/p/60753993
https://zhuanlan.zhihu.com/p/54947519
https://zhuanlan.zhihu.com/p/100182978?utm_source=wechat_session
https://blog.csdn.net/u014453898/article/details/92080859
https://blog.csdn.net/mathlxj/article/details/104951640
二、一些值得学习的用法笔记
#将start_dim至end_dim展成一维向量
torch.flatten(tenor, start_dim, end_dim)
x = torch.flatten(x, start_dim=1)
#效果同下
x = x.view(x.size(0), -1)
#使用何大佬在2015年提出的方法
torch.nn.init.kaiming_normal_(tensor, a=0,
model='fan_in', nonlinearity='leaky_relu')
nn.init.kaiming_normal_(m.weight, model='fan_out',
nonlinearity='relu')
#使用均值为mean,标准差为std的正态分布填充输入tensor
torch.nn.init.normal_(tensor, mean=0., std=1.)
#使用浮点数val填充tensor
nn.init.constant_(tensor, val)
#搭建网络的一种范式
layer = []
layer += [nn.Conv2d(...), nn.ReLU(inplace=True)]
layer += [nn.BatchNorm2d(...)]
nn.Sequential(*layers)
#从网络上加载参数
torch.hub.load_state_dict_from_url(url, model_dir=None, map_location=None, progress=True)
#url-下载的目标网址
#model_dir - 保存参数的目录
#map_location - a function or a dict specifying how to remap storeage locations.
state_dict = load_state_dict_from_url(model_urls[arch],
progress=progress)
#progress - 是否展示下载的进度条
#载入参数到模型
#torch.nn.modules.module.Module
#def load_state_dict(self, state_dict, strict=True)
model.load_state_dict(state_dict)
#*args 和 **kwargs都代表1个或多个参数的意思.*args传入tuple类型的无名参数,而**kwargs传入的参数是dict类型
def myprint(*args):
print(*args)
myprint(10, 2) #10 2
def mykwprint(**kwargs):
key = kwargs.keys()
value = kwargs.values()
print(key) #dict_keys(['epoch', 'LR'])
print(value) #dict_values([10, 2])
mykwprint(epoch=10, LR=2)