提示1:學習地址點這里
提示1:《Word embeddings: how to transform text into numbers》翻譯速覽點這里
文章目錄
- 前言
- 一、模型構建流程
- 1.1 資料預處理
- 1.2 模型的構建和訓練
- 二、實驗小結
- 總結
前言
??Task01主要是采用RNN框架 (注意:本文對RNN原理不做詳細的解讀)、 IMDB資料集來構建了一個文本情感分析任務的Baseline模型,
一、模型構建流程
1.1 資料預處理
??TorchText 資料預處理包含以下步驟:
步驟1:使用Field來處理資料;
步驟2:使用Datasets加載要用的IMDB資料集,設定訓練集和測驗集;
步驟3:必須構建一個 詞匯表,這樣做是因為我們的模型不能對字串進行操作,只能對數字進行操作;
步驟4:創建迭代器,需要創建驗證集,測驗集,以及訓練集的迭代器, 每一次的迭代都會回傳一個batch的資料,
??注意1:對于步驟二中,可以通過設定split_ratio引數來設定訓練集和驗證集的比例,即 split_ratio 為 0.8 意味著 80% 的示例構成訓練集,20% 構成驗證集,默認情況下,資料將按照70%和30%的比例劃分為訓練集和驗證集,
??注意2:隨機種子SEED傳遞給 random_state 引數,用來確保我們每次獲得相同的訓練集和驗證集,
1.2 模型的構建和訓練
??一、模型構建流程如下:
??注意梯度清零問題
1、選擇模型,這里使用的是RNN;使用torch.nn進行模型加載;
2、定義引數;
3、計算要訓練的引數數目(可選);
4、模型訓練
??4.1、設定優化器,這里選擇的是SGD;
??4.2、定義損失函式,這里使用的是BCEWithLogitsLoss;
??4.3、用【 .to】, 可以將張量放到gpu上計算;(可選)
??4.4、計算準確率;
??4.5、train()函式迭代所有的樣本,每次都是一個batch,【訓練函式】;
??4.6、模型評估;
??4.7、計算每個epoch的消耗時間;(可選)
??4.8、模型訓練【注意模型保存】與模型驗證;
??二、模型構建函式提示:
# 構建模型
class RNN(nn.Module):
def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim):
...
def forward(self, text):
...
------------------------------------------------------
# 引數計算
def count_parameters(model):
...
------------------------------------------------------
# 優化器、損失函式、gpu計算
import torch.optim as optim
optimizer = optim.SGD(model.parameters(), lr=1e-3)
criterion = nn.BCEWithLogitsLoss()
model = model.to(device)
criterion = criterion.to(device)
------------------------------------------------------
# 準確率
def binary_accuracy(preds, y):
...
------------------------------------------------------
# 訓練函式
def train(model, iterator, optimizer, criterion):
...
------------------------------------------------------
# 模型評估
def evaluate(model, iterator, criterion):
...
------------------------------------------------------
# 訓練消耗時間
import time
def epoch_time(start_time, end_time):
...
------------------------------------------------------
# 模型訓練與驗證
N_EPOCHS = 5
best_valid_loss = float('inf')
for epoch in range(N_EPOCHS):
start_time = time.time()
train_loss, train_acc = train(model, train_iterator, optimizer, criterion)
valid_loss, valid_acc = evaluate(model, valid_iterator, criterion)
end_time = time.time()
epoch_mins, epoch_secs = epoch_time(start_time, end_time)
if valid_loss < best_valid_loss:
best_valid_loss = valid_loss
torch.save(model.state_dict(), 'tut1-model.pt')
print(f'Epoch: {epoch+1:02} | Epoch Time: {epoch_mins}m {epoch_secs}s')
print(f'\tTrain Loss: {train_loss:.3f} | Train Acc: {train_acc*100:.2f}%')
print(f'\t Val. Loss: {valid_loss:.3f} | Val. Acc: {valid_acc*100:.2f}%')
# 驗證
model.load_state_dict(torch.load('tut1-model.pt'))
test_loss, test_acc = evaluate(model, test_iterator, criterion)
print(f'Test Loss: {test_loss:.3f} | Test Acc: {test_acc*100:.2f}%')
二、實驗小結
??實驗發現,準確率非常低,且5個epoch的訓練程序中,訓練loss與驗證loss基本不變,結合模型自身特點,猜測為欠擬合問題,后續的學習將會對模型進行調優,關于深度學習之Loss不下降原因有很多因素,這里指路一篇文章供大家閱讀,
深度學習之Loss不下降原因分析點這里
總結
??以上就是Task01的全部內容了,如果遇到原文鏈接無法加載的情況,可聯系博主索要,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300563.html
標籤:其他
