pytorch---之BN层参数详解及应用(1,2,3)(1,2)?

it2022-05-05  202

BN层参数详解(1,2)

一般来说pytorch中的模型都是继承nn.Module类的,都有一个属性trainning指定是否是训练状态,训练状态与否将会影响到某些层的参数是否是固定的,比如BN层(对于BN层测试的均值和方差是通过统计训练的时候所有的batch的均值和方差的平均值)或者Dropout层(对于Dropout层在测试的时候所有神经元都是激活的)。通常用model.train()指定当前模型model为训练状态,model.eval()指定当前模型为测试状态。同时,BN的API中有几个参数需要比较关心的,一个是affine指定是否需要仿射,还有个是track_running_stats指定是否跟踪当前batch的统计特性。容易出现问题也正好是这三个参数:trainning,affine,track_running_stats。其中的affine指定是否需要仿射,也就是是否需要上面算式的第四个,如果affine=False则γ=1,β=0 \gamma=1,\beta=0γ=1,β=0,并且不能学习被更新。一般都会设置成affine=True。(这里是一个可学习参数,)trainning和track_running_stats,track_running_stats=True表示跟踪整个训练过程中的batch的统计特性,得到方差和均值,而不只是仅仅依赖与当前输入的batch的统计特性(意思就是说新的batch依赖于之前的batch的均值和方差这里使用momentum参数,参考了指数移动平均的算法EMA)。相反的,如果track_running_stats=False那么就只是计算当前输入的batch的统计特性中的均值和方差了。当在推理阶段的时候,如果track_running_stats=False,此时如果batch_size比较小,那么其统计特性就会和全局统计特性有着较大偏差,可能导致糟糕的效果。

应用技巧:(1,2)

       通常pytorch都会用到optimizer.zero_grad() 来清空以前的batch所累加的梯度,因为pytorch中Variable计算的梯度会进行累计,所以每一个batch都要重新清空一次梯度,原始的做法是下面这样的:

       问题:参数non_blocking,以及pytorch的整体框架??

代码(1)

for index,data,target in enumerate(dataloader): data = data.cuda(non_blocking=True) target = torch.from_numpy(np.array(target)).float().cuda(non_blocking = Trye) output = model(data) loss = criterion(output,target) #清空梯度 optimizer.zero_grad() loss.backward() optimizer.step()

 

      而这里为了模仿minibacth,我们每次batch不清0,累积到一定次数再清0,再更新权重:

for index, data, target in enumerate(dataloader): #如果不是Tensor,一般要用到torch.from_numpy() data = data.cuda(non_blocking = True) target = torch.from_numpy(np.array(target)).float().cuda(non_blocking = True) output = model(data) loss = criterion(data, target) loss.backward() if index
转载请注明原文地址: https://win8.8miu.com/read-1181.html

最新回复(0)