1. 程式人生 > >pytorch 卷積神經網路(alexnet)訓練中問題以及解決辦法(更新中)

pytorch 卷積神經網路(alexnet)訓練中問題以及解決辦法(更新中)

上一篇部落格中使用的是pytorch中的預訓練模型效果較好。https://blog.csdn.net/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:在電腦上跑,出現記憶體無法訪問的錯誤。

還未找出問題所在。