模型訓練與驗證

2021-10-06 16:15:41 字數 3298 閱讀 2943

模型訓練

網路模型構建好後,需要利用訓練資料不斷進行學習訓練來降低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個不同超引數訓...