Pytorch构建网络细节总结

optimizer.step() 和 scheduler.step() 的区别

定义:

# 优化器使用 Adam。第一个参数是待优化的参数,一般为网络的权重
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# 每隔step_size个epoch,将学习率衰减为(上一次的学习率*gamma),verbose:每次学习率更新时在控制台打印相应信息
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30,gamma=0.1,last_epoch=-1,verbose=False) 

区别:

optimizer.step() 是对模型参数进行更新
scheduler.step() 是对学习率进行更新

.to(device)与.cuda()的区别

.to(device) 可以指定CPU 或者GPU

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # 单GPU或者CPU
model.to(device)
#如果是多GPU
if torch.cuda.device_count() > 1:
  model = nn.DataParallel(model,device_ids=[0,1,2])
model.to(device)

.cuda() 只能指定GPU

#指定某个GPU
os.environ['CUDA_VISIBLE_DEVICE']='1'
model.cuda()
#如果是多GPU
os.environment['CUDA_VISIBLE_DEVICES'] = '0,1,2,3'
device_ids = [0,1,2,3]
net  = torch.nn.Dataparallel(net, device_ids =device_ids)
net  = torch.nn.Dataparallel(net) # 默认使用所有的device_ids 
net = net.cuda()

model.train() 和 model.eval() 原理与用法

pytorch可以给我们提供两种方式来切换训练和评估(推断)的模式,分别是:model.train() 和 model.eval()。
一般用法是:在训练开始之前写上 model.trian() ,在测试时写上 model.eval() 。

功能:

1.model.train()
在使用 pytorch 构建神经网络的时候,训练过程中会在程序上方添加一句model.train(),作用是 启用 batch normalizationdropout

如果模型中有 BN层(Batch Normalization)Dropout ,需要在 训练时 添加 model.train()。

model.train() 是保证 BN 层能够用到 每一批数据 的均值和方差。对于 Dropout,model.train() 是 随机取一部分 网络连接来训练更新参数。

2. model.eval()
model.eval()的作用是 不启用 Batch Normalization 和 Dropout。

如果模型中有 BN 层(Batch Normalization)和 Dropout,在 测试时 添加 model.eval()。

model.eval() 是保证 BN 层能够用 全部训练数据 的均值和方差,即测试过程中要保证 BN 层的均值和方差不变。对于 Dropout,model.eval() 是利用到了 所有 网络连接,即不进行随机舍弃神经元。

也就是说,测试过程中使用model.eval(),这时神经网络会 沿用训练时的batch normalization 的参数,而并不使用 dropout。

3.总结与对比
如果模型中有 BN 层(Batch Normalization)和 Dropout,需要在训练时添加 model.train(),在测试时添加 model.eval()。

其中 model.train() 是保证 BN 层用每一批数据的均值和方差,而 model.eval() 是保证 BN 用全部训练数据的均值和方差;
而对于 Dropout,model.train() 是随机取一部分网络连接来训练更新参数,而 model.eval() 是利用到了所有网络连接。

Dropout在CNN结构中逐渐弃用及原因

1.dropout对卷积层的正则化的作用很小

原因呢?由于卷积层只有很少的参数,他们本身就不需要多少正则化。更进一步说,特征图编码的是空间的关系,特征图的激活是高度相关的,这也导致了dropout的失效。

2.dropout所擅长的正则化慢慢的过时了

像VGG16这样的大型的网络后面有全连接层,对于这样的模型,需要考虑过拟合,所以在全连接之间使用dropout,但目前的主流结构中全连接层几乎被弃用了,反之用global average pooling 来代替全连接层,这种卷积网络可以减小模型的size,同时提高模型表现力。

实验:构建了5个完全相同的卷积网络结构,然后分别在卷积之间插入dropout,batch norm,或者什么也不插入(control),在Cifar100的数据集上训练每个模型,得到了下面的结果。。
在这里插入图片描述
在这里插入图片描述
使用BN的表现最好,说明在卷积之间应该使用BN。
更进一步说,dropout不应该放在卷积之间,dropout越大,模型表现越差。

optimizer.zero_grad() loss.backward() optimizer.step()

optimizer.zero_grad():梯度清零
loss.backward():重新计算梯度并回传
optimizer.step():网络参数更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值