pytorch 卷积神经网络(alexnet)训练中问题以及解决办法(更新中)

本文探讨了使用三种不同方式实现AlexNet进行图像分类任务的过程及遇到的问题。第一种为完全自定义实现;第二种利用PyTorch预训练模型并调整输出类别;第三种同样基于预训练模型但重写了全连接层。实验表明前两种方法能在约130和160个epoch达到90%准确率。此外还讨论了模型初始化和学习率调整策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇博客中使用的是pytorch中的预训练模型效果较好。https://blog.youkuaiyun.com/pc1022/article/details/80440913这篇博客是自己训练 卷积神经网络,最开始以简单的alexnet进行训练。

对alexnet代码有三个版本的:

第一个版本是自己完全新建一个alexnet函数。

第二个版本是:

model = models.alexnet(pretrained=False, num_classes=2)

第三个版本是:

alexnet_model = models.alexnet(pretrained=False)
alexnet_model.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, 2),
        )
model = alexnet_model   

目前还不懂这三个版本的区别。

但是从结果上来看,版本一和三可以训练出来效果,达到90%分别是130个epoch和160个epoch左右。

自己想想这个结果是可以通过微调学习率(版本一和三的学习率是固定的0.001),是可以减少epoch的。

针对版本二的问题,以代码alexnet_init.py会出现以下两个问题:

alexnet_init.py我加入了模型参数初始化:

def weignts_init(model):
    if isinstance(model, nn.Conv2d):
        init.normal(model.weight.data)
        init.normal(model.bias.data)
    elif isinstance(model, nn.BatchNorm2d):
        init.normal(model.weight.data)
        init.normal(model.bias.data)

还有加入学习率变化:

cheduler = torch.optim.lr_scheduler.StepLR(optimizer,
                                            step_size=step_size, gamma=factor, last_epoch=-1)

问题1:从一开始loss值没有变化过(变化幅度很小)。

解决尝试:修改学习率。 尝试过很多种学习率的修改,基本把pytorch修改学习率的函数都使用了。

函数如下:

(1) 这是固定多少个epoch修改一次学习率。

scheduler = torch.optim.lr_scheduler.StepLR(optimizer,
                               step_size=step_size, gamma=factor, last_epoch=-1)   step_size = 2,factor = 0.1

问题2:在电脑上跑,出现内存无法访问的错误。

个人认为是内存泄露,不过没有找出问题所在。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值