pytorch NNLM 模型的簡單實現(注釋版)

2021-10-07 10:01:17 字數 3870 閱讀 9007

我是跟著b站乙個up主的部落格學的**,然後自己新增了一些注釋

import torch

import torch.nn as nn

import torch.optim

import torch.utils.data as data

dtype = torch.floattensor

sentences = ['i like cat', 'i love coffee', 'i hate milk']

#將上面的單詞逐個分開

word_list = " ".join(sentences).split()

#將分詞後的結果去重

word_list = list(set(word_list))

#對單詞建立索引,for迴圈裡面是先取索引,再取單詞

word_dict =

#反向建立索引

number_dict =

#計算詞典長度

n_class = len(word_dict)

#nnlm的計算步長

n_step = len(sentences[0].split())-1

#隱藏層的參數量

n_hidden = 2

#嵌入詞向量的維度

m = 2

#構建輸入輸出資料

def make_batch(sentences):

input_batch =

target_batch =

for sen in sentences:

word = sen.split()#將句子中每個詞分詞

#:-1表示取每個句子裡面的前兩個單詞作為輸入

#然後通過word_dict取出這兩個單詞的下標,作為整個網路的輸入

input = [word_dict[n] for n in word[:-1]] # [0, 1], [0, 3], [0, 5]

#target取的是**單詞的下標,這裡就是cat,coffee和milk

target = word_dict[word[-1]] # 2, 4, 6

#輸入資料集

#輸出資料集

return input_batch, target_batch

input_batch, target_batch = make_batch(sentences)

#將資料裝載到torch上

input_batch = torch.longtensor(input_batch)

target_batch = torch.longtensor(target_batch)

dataset = data.tensordataset(input_batch, target_batch)

loader = data.dataloader(dataset=dataset, batch_size=16, shuffle=true)

#定義網路結構,繼承nn.module

class nnlm(nn.module):

def __init__(self):

super(nnlm, self).__init__()

#計算詞向量表,大小是len(word_dict) * m

self.c = nn.embedding(n_class, m)

#下面就是初始化網路引數,公式如下

"""hiddenout = tanh(d + x*h)

y = b + x*h + hiddenout*u

"""self.h = nn.parameter(torch.randn(n_step * m, n_hidden).type(dtype))

self.w = nn.parameter(torch.randn(n_step * m, n_class).type(dtype))

self.d = nn.parameter(torch.randn(n_hidden).type(dtype))

self.u = nn.parameter(torch.randn(n_hidden, n_class).type(dtype))

self.b = nn.parameter(torch.randn(n_class).type(dtype))

def forward(self, x):

'''x: [batch_size, n_step]

'''#根據詞向量表,將我們的輸入資料轉換成三維資料

#將每個單詞替換成相應的詞向量

x = self.c(x) # [batch_size, n_step] => [batch_size, n_step, m]

#將替換後的詞向量表的相同行進行拼接

#view的第乙個引數為-1表示自動判斷需要合併成幾行

x = x.view(-1, n_step * m) # [batch_size, n_step * m]

hidden_out = torch.tanh(self.d + torch.mm(x, self.h)) # [batch_size, n_hidden]

output = self.b + torch.mm(x, self.w) + torch.mm(hidden_out, self.u) # [batch_size, n_class]

return output

model = nnlm()

#分類問題用交叉熵作為損失函式

criterion = nn.crossentropyloss()

#優化器使用adam

#所謂的優化器,實際上就是你用什麼方法去更新網路中的引數

optimizer = torch.optim.adam(model.parameters(), lr=1e-3)

# 開始訓練

for epoch in range(5000):

for batch_x, batch_y in loader:

optimizer.zero_grad()

output = model(batch_x)

# output : [batch_size, n_class], batch_y : [batch_size] (longtensor, not one-hot)

loss = criterion(output, batch_y)

#每1000次列印一次結果

if (epoch + 1)%1000 == 0:

print('epoch:', '%04d' % (epoch + 1), 'cost =', ''.format(loss))

#反向傳播更新梯度

loss.backward()

optimizer.step()

# predict

# max()取的是最內層維度中最大的那個數的值和索引,[1]表示取索引

predict = model(input_batch).data.max(1, keepdim=true)[1]

# test

# squeeze()表示將陣列中維度為1的維度去掉

print([sen.split()[:n_step] for sen in sentences], '->', [number_dict[n.item()] for n in predict.squeeze()])

最後的結果如下

epoch: 1000 cost = 0.371559

epoch: 2000 cost = 0.069313

epoch: 3000 cost = 0.012472

epoch: 4000 cost = 0.004256

epoch: 5000 cost = 0.001829

[['i', 'like'], ['i', 'love'], ['i', 'hate']] -> ['cat', 'coffee', 'milk']

linux 裝置模型簡析

file operations 不可能被拋棄。它是字元裝置的基礎結構,各種裝置模型或者說匯流排,只是對字元裝置進行了包裝。驅動一定是核心模組 核心模組不一定是驅動 裝置模型的初衷 是省電 建立一條 掛有 所有裝置的樹 全域性裝置樹 與使用者空間的通訊 裝置間的通訊 都是通過 sysfs檔案系統實現的...

python評分卡模型 簡書 評分卡模型

信用評分卡分類 a卡 申請評分卡,側重貸前,在客戶獲取期,建立信用風險評分,客戶帶來違約風險的概率大小 b卡 行為評分卡,側重貸中,在客戶申請處理期,建立申請風險評分模型,客戶開戶後一定時期內違約拖欠的風險概率,有效排除了信用不良客戶和非目標客戶的申請 c卡 催收評分卡,側重貸後,在帳戶管理期,建立...

《大道至簡》閱讀筆記 EHM模型

2007 07 01 愚公移山只是一種精神追求,而做工程最求的則是完成工程。在忙忙碌碌的日常開發中,不要忘了自己的位置,時刻提醒自己,你在做什麼?ehm模型分析了軟體工程中各個環節的由來,價值及其內在關係。可以很清楚的知道自己在工程的位置。實現 程式 演算法 資料結構 方法 面向過程 oop mda...