神經網路訓練與預測時結果不一致的一種原因
阿新 • • 發佈:2021-01-30
為了防止過擬合,我設定了提前終止early stop。發現預測時的train accuracy與訓練時打印出的max train accuracy並不一致。經斷點除錯,發現是early stop程式碼段的問題
if test_accuracy > self.max_test_acc and train_accuracy > self.max_train_acc - 0.04:
self.max_test_acc = test_accuracy
self.max_acc_epoch = epoch
self. train_sync_acc = train_accuracy
if train_accuracy > self.max_train_acc:
self.max_train_acc = train_accuracy
self.best_net = self.net.state_dict() # 這裡有問題
print('*' * 50)
print('epoch', epoch + 1, 'current loss', loss.cpu().data, 'train acc:', train_accuracy,
'current max test acc:' , self.max_test_acc)
print('*' * 50)
if epoch > self.max_acc_epoch + early_stop:
break
問題就出在標記處,我本來是想每獲得一個最大的test accuracy就儲存當前net。但是這步賦值後,self.best_net
與self.net.state_dict()
地址完全一致,兩者同時變化,因而這步賦值就沒有任何意義了。
修改方法:使用深拷貝
from copy import deepcopy
...
self.best_net = deepcopy(self.net.state_dict( ))
...
改過了之後就正常了~
(用的是PyTorch框架)