預備知識
- 自己搭建
cnn
模型訓練mnist
(不使用遷移學習)
pytorch
官方的遷移學習教程(螞蟻、蜜蜂分類)
學習目標
今天我們嘗試在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張圖片,已經提升很高。當然,因為網絡變深了,所以訓練花費的時間也就增加了。