典型模型

1. Attention機(jī)制在機(jī)器翻譯中的第一次應(yīng)用

https://github.com/Maab-Nimir/Neural-Machine-Translation-by-Jointly-Learning-to-Align-and-Translate/blob/main/Neural_Machine_Translation_by_Jointly_Learning_to_Align_and_Translate.ipynb

2. 寫(xiě)并訓(xùn)練模型的流程

import torch
import torch.nn as nn
import torch.nn.functional as F
import random
from torch.utils.data import TensorDataset, DataLoader 
from sklearn.metrics import accuracy_score
import numpy as np
import time

learning_rate = 2e-5
weight_decay = 1e-2
epsilon = 1e-8
epoch_num = 5
gpu_id = 1
model_save_path = './'
# 自定義模型策橘,繼承nn.Module
class TModel(nn.Module):
    def __init__(self):
        super(TModel, self).__init__()
        # 自定義網(wǎng)絡(luò)
        self.ff = nn.Linear(100, 2)
        self.relu = nn.ReLU()
    # 自定義前向傳播
    def forward(self, x):
        x = F.relu(self.ff(x))

        return x

def get_train_data():
    # 初始化數(shù)據(jù)
    torch.manual_seed(1)
    x = np.random.randn(1000, 100)
    # 這里就是向量焚刺,不是500*1的矩陣
    y = np.concatenate((np.ones((500)), np.zeros((500))), axis=0)

    # shuffle數(shù)據(jù)
    shuffle_data = [(x[i], y[i]) for i in range(len(x))]
    random.shuffle(shuffle_data)

    # 將數(shù)據(jù)轉(zhuǎn)換為tensor
    input_x = torch.Tensor([e[0] for e in shuffle_data])
    input_y = torch.Tensor([e[1] for e in shuffle_data]).long() # CE的源碼中要求label的dtype就是long
    # 劃分訓(xùn)練集和驗(yàn)證集
    td_index = int(len(shuffle_data) * 0.9)
    # 打包訓(xùn)練集和驗(yàn)證集
    train_dataset = TensorDataset(input_x[: td_index], input_y[: td_index])
    train_dataloader = DataLoader(train_dataset, batch_size=32, shuffle=True)

    dev_dataset = TensorDataset(input_x[td_index: ], input_y[td_index: ])
    dev_dataloader = DataLoader(dev_dataset, batch_size=32, shuffle=True)

    return train_dataloader, dev_dataloader


def main():
    # 初始化模型對(duì)象
    model = TModel()
    model.cuda(gpu_id)

    # 定義loss函數(shù)
    loss_fn = nn.CrossEntropyLoss()
    # 定義優(yōu)化器,選擇梯度下降算法
    # 法1. 用Adam優(yōu)化器
    optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
    
    # 法2. 用AdamW優(yōu)化器的權(quán)重衰減防止過(guò)擬合蒋搜。針對(duì)transformers中的模型優(yōu)化
    # no_decay = ['bias', 'LayerNorm.weight']
    # optimizer_grouped_parameters = [
    #     {'params' : [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)],
    #     'weight_decay' : weight_decay
    #     },
    #     {'params' : [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)],
    #     'weight_decay' : 0.0
    #     }
    # ]
    # optimizer = torch.optim.AdamW(optimizer_grouped_parameters, lr = learning_rate, eps = epsilon)

    # 準(zhǔn)備數(shù)據(jù)
    train_dataloader, dev_dataloader = get_train_data()
    max_dev_acc = 0.9
    # 按epoch迭代
    for epoch in range(epoch_num):
        # 設(shè)置為訓(xùn)練模式
        model.train()
        # 初始化每個(gè)epoch的pred和groundtruth列表
        train_pred, train_true = [], []
        for x_i, y_i in train_dataloader:
            # 將tensor放到cuda()上
            x_i = x_i.cuda(gpu_id)
            y_i = y_i.cuda(gpu_id)

            output = model(x_i)
            # print(output[:2])
            # print(y_i[:2])
            loss = loss_fn(output, y_i)
            # train階段需要計(jì)算梯度嘉汰,反向傳播屎债,更新參數(shù)
            optimizer.zero_grad()
            loss.backward()
            # 梯度裁剪放闺,防止梯度爆炸
            nn.utils.clip_grad_norm_(model.parameters(), 1.0)
            optimizer.step()

            train_pred += torch.max(output, dim=1)[1].cpu().numpy().tolist()
            train_true += y_i.cpu().numpy().tolist()

        print("Epoch: %d: train acc[%.3f]" % (epoch, accuracy_score(train_pred, train_true)))

        # 設(shè)置為驗(yàn)證模式
        model.eval()
        # 初始化每個(gè)epoch的pred和groundtruth列表
        with torch.no_grad():
            dev_pred, dev_true = [], []
            for x_i, y_i in dev_dataloader:
                # 將tensor放到cuda()上
                x_i = x_i.cuda(gpu_id)
                y_i = y_i.cuda(gpu_id)

                output = model(x_i)
                # loss = loss_fn(output, y_i)

                dev_pred += torch.max(output, dim=1)[1].cpu().numpy().tolist()
                dev_true += y_i.cpu().numpy().tolist()
            dev_acc = accuracy_score(dev_pred, dev_true)
            print("Epoch: %d: dev acc[%.3f]" % (epoch, dev_acc))

            if dev_acc > max_dev_acc:
                torch.save(model.state_dict(), model_save_path + 'epoch_%d_dev_acc_%.3f' % (epoch, dev_acc))
                max_dev_acc = dev_acc


if __name__ == "__main__":
    time_start=time.time()
    main()
    time_end=time.time()
    print('totally cost',time_end-time_start)

DataLoader中的collate_fn參數(shù)

轉(zhuǎn)自 https://www.cnblogs.com/zf-blog/p/11360557.html
一般的观蜗,默認(rèn)的collate_fn函數(shù)是要求一個(gè)batch中的文本都具有相同size(因?yàn)橐鰏tack操作)。
當(dāng)一個(gè)batch中的文本大小都不同時(shí)逆甜,可以使用自定義的collate_fn函數(shù)虱肄,則一個(gè)batch中的圖片不再被stack操作,可以全部存儲(chǔ)在一個(gè)list中交煞,當(dāng)然還有對(duì)應(yīng)的label咏窿,如下面這個(gè)例子:

def my_collate(batch):
    data = [item[0] for item in batch]
    target = [item[1] for item in batch]
    target = torch.LongTensor(target)
    return [data, target]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市素征,隨后出現(xiàn)的幾起案子集嵌,更是在濱河造成了極大的恐慌,老刑警劉巖御毅,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件根欧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡端蛆,警方通過(guò)查閱死者的電腦和手機(jī)凤粗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)今豆,“玉大人嫌拣,你說(shuō)我怎么就攤上這事⊥碓洌” “怎么了亭罪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)歼秽。 經(jīng)常有香客問(wèn)我应役,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任箩祥,我火速辦了婚禮院崇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袍祖。我一直安慰自己底瓣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布蕉陋。 她就那樣靜靜地躺著捐凭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凳鬓。 梳的紋絲不亂的頭發(fā)上茁肠,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音缩举,去河邊找鬼垦梆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仅孩,可吹牛的內(nèi)容都是我干的托猩。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辽慕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼京腥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鼻百,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绞旅,失蹤者是張志新(化名)和其女友劉穎摆尝,沒(méi)想到半個(gè)月后温艇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堕汞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年勺爱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讯检。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡琐鲁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出人灼,到底是詐尸還是另有隱情围段,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布投放,位于F島的核電站奈泪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涝桅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一拜姿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冯遂,春花似錦蕊肥、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至裸准,卻和暖如春儒洛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狼速。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工琅锻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人向胡。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓恼蓬,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親僵芹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子处硬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容