学习记录(五)(每日修改)

1. python for循环的坑

无法修改for中i的值

for i in range(4):
    print(i)
    i=i+1

实际输出还是0,1,2,3

只能通过变成while语句来实现

2.Pytorch设置不同学习率

我在看论文的过程中,发现了大多数作者针对模型刚开始会采用大的学习率,随着epoch或者层数的增加,而不断改变学习率的大小,我就很感兴趣(离全职调参又近了一步)。

2.1针对不同层

Pytorch不同层设置不同学习率_呆呆象呆呆的博客-CSDN博客_pytorch 不同学习率

这是简单的网络层

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.net1 = nn.Linear(2,10)
        self.net2 = nn.Linear(10,1)
    def forward(self, x):
        x = self.net1(x)
        x = self.net2(x)
        return x
net = Net()
# 以字典的形式进行对不同参数组的所需要的优化参数定义
optimizer = optim.SGD([
        {"params":net.net1.parameters()},
        {"params":net.net1.parameters(),"lr":1e-5},],
        lr=1e-2, #默认参数
    )

针对resnet101

model = torchvision.models.resnet101(pretrained=True)
large_lr_layers = list(map(id,model.fc.parameters()))
small_lr_layers = filter(lambda p:id(p) not in large_lr_layers,model.parameters())
optimizer = torch.optim.SGD([
            {"params":large_lr_layers},
            {"params":small_lr_layers,"lr":1e-4}
            ],lr = 1e-2,momenum=0.9)

针对卷积层

class net(nn.Module):
    def __init__(self):
        super(net, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, 1)
        self.conv2 = nn.Conv2d(64, 64, 1)
        self.conv3 = nn.Conv2d(64, 64, 1)
        self.conv4 = nn.Conv2d(64, 64, 1)
        self.conv5 = nn.Conv2d(64, 64, 1)
    def forward(self, x):
        out = conv5(conv4(conv3(conv2(conv1(x)))))
        return out
net = net()
lr = 0.001
conv5_params = list(map(id, net.conv5.parameters()))
conv4_params = list(map(id, net.conv4.parameters()))
base_params = filter(lambda p: id(p) not in conv5_params + conv4_params,
                     net.parameters())
optimizer = torch.optim.SGD([
            {'params': base_params},
            {'params': net.conv5.parameters(), 'lr': lr * 100},
            {'params': net.conv4.parameters(), 'lr': lr * 100},
            , lr=lr, momentum=0.9)

2.2针对不同epoch

更多细节可以查阅:Pytorch中的学习率调整方法_卡卡南安的博客-CSDN博客_pytorch 学习率调整

这边简单罗列两个

更新策略:每过step_size个epoch,做一次学习率更新,更新后的学习率为:new_lr = initial_lr *gamma
其中optimizer参数为优化器,需要提前设定,例如:SGD、Adam等

from torch.optim import lr_scheduler

exp_lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=step_size, gamma=0.1)

更新策略:每遇到milestones中的epoch,做一次学习率更新,更新后的学习率为:
new_lr = initial_lr *gamma

from torch.optim import lr_scheduler

milestones = [40,60,80]
exp_lr_scheduler = lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1)

3.GFLOPs

我看到论文会出现GFLOPs这个数值,在我印象中应该是用来表示运算的,也确实表示每秒10亿次的浮点运算数,应该是用来观察GPU的功耗情况!

4.迁移学习大致步骤

迁移学习就是通过别人训练好的大规模大Epoch的模型参数,来直接跑自己的数据,一般调节是针对模型的结构微调,以及最后的fc,改成自己最终想要分的类的个数,我这边按照cifar-10为例子大致过一下流程,代码还是很多的,自己找一下就行。

4.1下载数据集

4.2下载model.pth

比如resnet18.pth 里面应该放的是resnet18各个参数的权重比

resnet18总参数个数就达到了11181642

但是如果去最后一个fc,就可以降到5130

4.3冻结层,修改fc

就像之前提及的,需要在训练过程中只修改最后的fc即可

    # 使用预训练模型
    resnet = models.resnet18(pretrained=True)

    # 冻结模型参数
    for param in resnet.parameters():
        param.requires_grad = False

    # 修改最后的全连接层改为十分类
    resnet.fc = nn.Linear(512, 10)

同样优化器也是只针对最后一层

optimizer = torch.optim.SGD(resnet.fc.parameters(), lr=1e-3, weight_decay=1e-3, momentum=0.9)  # 优化器

别的内容都是正常训练过程!

5.划分训练集验证集

利用sklearn里面的函数

from sklearn.model_selection import train_test_split

train_data, test_data = train_test_split(train_data, test_size=0.2, random_state=3407)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
max96712是一位热爱学习和编程的学生。他从小就对计算机科学和编程产生了浓厚的兴趣,因此他积极参加各种编程学习活动,并且记录了他的学习过程。 在学习记录方面,max96712养成了一个良好的学习习惯。他会将每一次学习的内容和进展都详细地记录下来,包括学习的时间、地点、学习的主题和内容等。这样的学习记录有助于他复习和总结,也方便他将来回顾和分享自己的学习经验。 在编程实践方面,max96712不仅在课程中学习编程知识和技巧,还注重积累实践经验。他会主动参加编程竞赛、参与开源项目或者自己动手完成一些小项目。这样的实践锻炼使他的编程能力得到了很大的提升,并且他也通过实践发现了自己在编程过程中的不足之处,进而加以改进。 max96712的学习记录和编程实践给他带来了很多好处。首先,这些记录帮助他发现自己的学习方法和效率,进而优化学习计划。其次,这些实践经验不仅让他在学术上得到了锻炼,也提高了他的解决问题的能力和创新思维。此外,这些记录和实践还为他申请进入优秀高校提供了有力的证明,并且也有助于他将来找工作时展示自己的实力和经验。 总之,max96712通过学习记录和编程实践不断提升自己的编程水平和综合能力。他将这些经验视为个人成长的重要组成部分,也将其应用于学业和职业发展中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值