【pytorch】使用遷移學習(resnet18)訓練mnist數據集


預備知識

  • 自己搭建cnn模型訓練mnist(不使用遷移學習)

https://blog.csdn.net/qq_42951560/article/details/109565625

  • pytorch官方的遷移學習教程(螞蟻、蜜蜂分類)

https://blog.csdn.net/qq_42951560/article/details/109950786

學習目標

今天我們嘗試在pytorch中使用遷移學習來訓練mnist數據集。

如何遷移

預訓練模型

遷移學習需要選擇一個預訓練模型,我們這個任務也不是特別大,選擇resnet18就行了。

數據預處理

resnet18輸入的CHW(3, 224, 224)

mnist數據集中單張圖片CHW(1, 28, 28)

所以我們需要對mnist數據集做一下預處理:
在這里插入圖片描述

# 預處理
my_transform = transforms.Compose([
        transforms.Resize((224, 224)),
        transforms.Grayscale(3),
        transforms.ToTensor(),
        transforms.Normalize((0.1307,0.1307,0.1307), (0.3081,0.3081,0.3081)),
    ])
# 訓練集
train_file = datasets.MNIST(
    root='./dataset/',
    train=True,
    transform=my_transform
)
# 測試集
test_file = datasets.MNIST(
    root='./dataset/',
    train=False,
    transform=my_transform
)

pytorch中數據增強和圖像處理的教程(torchvision.transforms)可以看我的這篇文章

改全連接層

resnet18是在imagenet上訓練的,輸出特征數是1000;而對於mnist來說,需要分10類,因此要改一下全連接層的輸出。

model = models.resnet18(pretrained=True)
in_features = model.fc.in_features
model.fc = nn.Linear(in_features, 10)

調整學習率

之前設置的Adam的學習率是1e-3,現在使用了遷移學習,所以學習率調小一點,改為1e-4

訓練結果

resnet18相較於普通的一兩層卷積網絡來說已經比較深了,並且mnsit數據集還是挺大的,總共有7萬張圖片。為了節省時間,我們使用7張GeForce GTX 1080 Ti來訓練:

  • 數據並行(DataParallel)
EPOCH: 01/10 STEP: 67/67 LOSS: 0.0266 ACC: 0.9940 VAL-LOSS: 0.0246 VAL-ACC: 0.9938 TOTAL-TIME: 102
EPOCH: 02/10 STEP: 67/67 LOSS: 0.0141 ACC: 0.9973 VAL-LOSS: 0.0177 VAL-ACC: 0.9948 TOTAL-TIME: 80
EPOCH: 03/10 STEP: 67/67 LOSS: 0.0067 ACC: 0.9990 VAL-LOSS: 0.0147 VAL-ACC: 0.9958 TOTAL-TIME: 80
EPOCH: 04/10 STEP: 67/67 LOSS: 0.0042 ACC: 0.9995 VAL-LOSS: 0.0151 VAL-ACC: 0.9948 TOTAL-TIME: 80
EPOCH: 05/10 STEP: 67/67 LOSS: 0.0029 ACC: 0.9997 VAL-LOSS: 0.0143 VAL-ACC: 0.9955 TOTAL-TIME: 80
EPOCH: 06/10 STEP: 67/67 LOSS: 0.0019 ACC: 0.9999 VAL-LOSS: 0.0133 VAL-ACC: 0.9962 TOTAL-TIME: 80
EPOCH: 07/10 STEP: 67/67 LOSS: 0.0013 ACC: 1.0000 VAL-LOSS: 0.0132 VAL-ACC: 0.9963 TOTAL-TIME: 80
EPOCH: 08/10 STEP: 67/67 LOSS: 0.0008 ACC: 1.0000 VAL-LOSS: 0.0132 VAL-ACC: 0.9963 TOTAL-TIME: 79
EPOCH: 09/10 STEP: 67/67 LOSS: 0.0006 ACC: 1.0000 VAL-LOSS: 0.0122 VAL-ACC: 0.9962 TOTAL-TIME: 79
EPOCH: 10/10 STEP: 67/67 LOSS: 0.0005 ACC: 1.0000 VAL-LOSS: 0.0131 VAL-ACC: 0.9959 TOTAL-TIME: 79
| BEST-MODEL | EPOCH: 07/10 STEP: 67/67 LOSS: 0.0013 ACC: 1.0000 VAL-LOSS: 0.0132 VAL-ACC: 0.9963

訓練10輪,最佳的模型出現在第7輪,最大准確率是0.9963。在這篇文章中,我們自己搭了兩層的卷積,也訓練了10輪,最大准確率是0.9923。准確率提高了0.0040,我們要知道測試集共有1萬張圖片,也就是多預測對了40張圖片,已經提升很高。當然,因為網絡變深了,所以訓練花費的時間也就增加了。

引用參考

https://blog.csdn.net/qq_42951560/article/details/109950786


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM