正交巻积,我自己的理解就算为了更好的train?因为,作者代码这个用到正交巻积的地方,就算这个train训练过程。然后没了,为了计算loss!
for i, (images, target) in enumerate(train_loader): # measure data loading time data_time.update(time.time() - end) if args.gpu is not None: images = images.cuda(args.gpu, non_blocking=True) target = target.cuda(args.gpu, non_blocking=True) # compute output output = model(images) ##### diff = utils.orth_dist(model.module.layer2[0].downsample[0].weight) + utils.orth_dist(model.module.layer3[0].downsample[0].weight) + utils.orth_dist(model.module.layer4[0].downsample[0].weight) diff += utils.deconv_orth_dist(model.module.layer1[0].conv1.weight, stride=1) + utils.deconv_orth_dist(model.module.layer1[1].conv1.weight, stride=1) diff += utils.deconv_orth_dist(model.module.layer2[0].conv1.weight, stride=2) + utils.deconv_orth_dist(model.module.layer2[1].conv1.weight, stride=1) diff += utils.deconv_orth_dist(model.module.layer3[0].conv1.weight, stride=2) + utils.deconv_orth_dist(model.module.layer3[1].conv1.weight, stride=1) diff += utils.deconv_orth_dist(model.module.layer4[0].conv1.weight, stride=2) + utils.deconv_orth_dist(model.module.layer4[1].conv1.weight, stride=1) ##### loss = criterion(output, target) + args.r * diff
parse_args()详解:
可以参考这篇文章的讲解:Python 讲堂 parse_args()详解_计算机视觉-Archer的博客-CSDN博客_parser.parse_args
训练和inference区别:
training主要是反向传播,修改(优化)权重
inference是模型训练好了,即权重计算好了,要通过模型,正向传播,根据权重计算y,也就是实际使用网络得到结果(有点类似于测试demo?)
而inference显然跟test是完全不同的,test过程其所跟train一样的,也是学习参数建立模型,只不过应用数据集不同。
更加形象的说法:参考深度学习的宏观框架——训练(training)和推理(inference)及其应用场景_Gaosiy的博客-CSDN博客_inference
验证集在深度学习中的作用:
我看了D3Dnet的代码,可以发现,train的过程中
parser.add_argument("--nEpochs", type=int, default=35, help="Number of epochs to train for")总共有35个epoch。然后它的具体的train的函数,也是循环这个epochs即循环35次epoch的迭代更新,可以发现这个train就算为了计算这个网络参数即权重。并且每个epoch完了之后,就验证过程走一下。所以这说明了,你train logs里面中途打印的loss啥的之类,都是验证集算的。
此外,这个D3Dnet是一个epoch迭代完成,保存一次模型权重。然后呢用验证集,并且一般验证集的batchsize是和train的batchsize是不同的。比如这里train的是64,而验证是8,通过计算然后来修正超参数(这就算验证集的作用)