模型訓練
網路模型構建好後,需要利用訓練資料不斷進行學習訓練來降低loss 提高模型效能 使得最後得到的結果誤差盡可能小,盡可能滿足需要
乙個成熟合格的深度學習訓練流程要滿足:
(1)在訓練集上進行訓練並在驗證集上進行驗證
(2)模型可以保留最優權重,並讀取權重
(3)記錄下訓練集和驗證集的精度,便於調參
構建驗證集
訓練過程是容易出現過擬合的,也就是模型過多的學習了資料比較細枝末節的特徵,而不是該類的特徵,即不具備普遍性的特徵,此時模型就會出現過擬合現象
而在訓練過程中要保證模型的改變不接觸測試集資料,來防止對測試集資料出現過擬合現象。這時候就需要驗證集來驗證模型的精度
一般情況下,可在本地劃分出乙個驗證集,進行本地驗證。訓練集、驗證集和測試集作用如下:
訓練集(train set):模型用於訓練和調整模型引數
驗證集(validation set):用來驗證模型精度和調整超引數
測試集(test set):驗證模型的泛化能力
因為訓練集和驗證集是分開的,所以模型在驗證集上的精度在一定程度上可以反映模型的泛化能力。在劃分驗證集的時候,需要注意驗證集的分布與測試集盡量保持一致,不然模型在驗證集上的精度就失去了指導意義。
載入訓練集
train_path = glob.glob(r'./dataset/mchar_train/*.png'
)train_path.sort(
)train_json = json.load(
open
('./dataset/mchar_train.json'))
train_lebel =
[train_json[x]
['label'
]for x in train_json]
print
(len
(train_path)
,len
(train_lebel)
)train_loader = torch.utils.data.dataloader(
svhndataset(train_path,train_lebel,
transforms.compose(
[ transforms.resize((64
,128))
, transforms.randomcrop((60
,120))
, transforms.colorjitter(
0.3,
0.3,
0.2)
, transforms.randomrotation(5)
, transforms.totensor(),
transforms.normalize(
[0.485
,0.456
,0.406],
[0.229
,0.244
,0.225])
])),
batch_size=40,
shuffle=
true
, num_workers=
0)
載入驗證集
val_path = glob.glob(r'./dataset/mchar_val/*.png'
)val_path.sort(
)val_json = json.load(
open
('./dataset/mchar_val.json'))
val_label=
[val_json[x]
['label'
]for x in val_json]
print
(len
(val_path)
,len
(val_json)
)val_loader = torch.utils.data.dataloader(
svhndataset(val_path,val_label,
transforms.compose(
[ transforms.resize((64
,128))
, transforms.totensor(),
transforms.normalize(
[0.485
,0.456
,0.406],
[0.229
,0.244
,0.225])
])),
batch_size=40,
shuffle=
false
, num_workers=
0)
訓練函式
def
train
(train_loader,model,criterion,optimizer)
:#訓練模式
model.train(
) train_loss=
for i,
(input
,target)
inenumerate
(train_loader)
:if use_cuda:
input
=input
.cuda(
) target = target.cuda(
) target = target.
long()
c0,c1,c2,c3,c4 = model(
input
) loss = criterion(c0,target[:,
0])+ \
criterion(c1,target[:,
1])+ \
criterion(c2,target[:,
2])+ \
criterion(c3,target[:,
3])+ \
criterion(c4,target[:,
4]) optimizer.zero_grad(
) loss.backward(
) optimizer.step(
)if i %
100==0:
print
(loss.item())
))return np.mean(train_loss)
模型訓練與驗證
樸素貝葉斯演算法 為了便於在普通電腦上執行相關程式,alexa和dga的樣本都取前10000個。把網域名稱當做乙個字串,使用n gram建模,以2 gram為例,把baidu.com進行建模,接下來向量化,輸出詞彙表。使用countvectorizer進行轉換即可,其中ngram range設定為 ...
模型選擇與訓練集 驗證集 測試集
在學習模型設計完成後,對模型進行訓練,可得到模型引數 通過假設函式公式 可得到 值。但怎麼知道訓練完成的模型效能怎麼樣呢?也就是說,通過該模型得到的 值準不準確?有沒有辦法提高準確度?這就是本節將要解決的問題。如圖所示,將原始資料以 6 2 2 分成 3 份。分別為 訓練集 交叉驗證集 測試集 訓練...
訓練集 測試集 驗證集與交叉驗證
當我們訓練好乙個模型時,我們不只希望這個模型只在訓練集上表現的好,更重要的是希望這個模型後續能表現的好,這時候就需要測試集,用於評估這個模型的泛化能力。通常情況下,我們將資料以8 2的比例分割訓練集和測試集。在演算法模型中,我們還要使用正則化技術,避免過擬合。其中乙個做法就是使用100個不同超引數訓...