最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pytorch 如何使用batch訓練lstm網(wǎng)絡

 更新時間:2021年05月28日 14:29:37   作者:king的江鳥  
這篇文章主要介紹了pytorch 如何使用batch訓練lstm網(wǎng)絡的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

batch的lstm

# 導入相應的包
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torch.utils.data as Data 
torch.manual_seed(1) 
 
# 準備數(shù)據(jù)的階段
def prepare_sequence(seq, to_ix):
    idxs = [to_ix[w] for w in seq]
    return torch.tensor(idxs, dtype=torch.long)
  
with open("/home/lstm_train.txt", encoding='utf8') as f:
    train_data = []
    word = []
    label = []
    data = f.readline().strip()
    while data:
        data = data.strip()
        SP = data.split(' ')
        if len(SP) == 2:
            word.append(SP[0])
            label.append(SP[1])
        else:
            if len(word) == 100 and 'I-PRO' in label:
                train_data.append((word, label))
            word = []
            label = []
        data = f.readline()
 
word_to_ix = {}
for sent, _ in train_data:
    for word in sent:
        if word not in word_to_ix:
            word_to_ix[word] = len(word_to_ix)
 
tag_to_ix = {"O": 0, "I-PRO": 1}
for i in range(len(train_data)):
    train_data[i] = ([word_to_ix[t] for t in train_data[i][0]], [tag_to_ix[t] for t in train_data[i][1]])
 
# 詞向量的維度
EMBEDDING_DIM = 128
 
# 隱藏層的單元數(shù)
HIDDEN_DIM = 128
 
# 批大小
batch_size = 10  
class LSTMTagger(nn.Module):
 
    def __init__(self, embedding_dim, hidden_dim, vocab_size, tagset_size, batch_size):
        super(LSTMTagger, self).__init__()
        self.hidden_dim = hidden_dim
        self.batch_size = batch_size
        self.word_embeddings = nn.Embedding(vocab_size, embedding_dim)
 
        # The LSTM takes word embeddings as inputs, and outputs hidden states
        # with dimensionality hidden_dim.
        self.lstm = nn.LSTM(embedding_dim, hidden_dim, batch_first=True)
 
        # The linear layer that maps from hidden state space to tag space
        self.hidden2tag = nn.Linear(hidden_dim, tagset_size)
 
    def forward(self, sentence):
        embeds = self.word_embeddings(sentence)
        # input_tensor = embeds.view(self.batch_size, len(sentence) // self.batch_size, -1)
        lstm_out, _ = self.lstm(embeds)
        tag_space = self.hidden2tag(lstm_out)
        scores = F.log_softmax(tag_space, dim=2)
        return scores
 
    def predict(self, sentence):
        embeds = self.word_embeddings(sentence)
        lstm_out, _ = self.lstm(embeds)
        tag_space = self.hidden2tag(lstm_out)
        scores = F.log_softmax(tag_space, dim=2)
        return scores 
 
loss_function = nn.NLLLoss()
model = LSTMTagger(EMBEDDING_DIM, HIDDEN_DIM, len(word_to_ix), len(tag_to_ix), batch_size)
optimizer = optim.SGD(model.parameters(), lr=0.1)
 
data_set_word = []
data_set_label = []
for data_tuple in train_data:
    data_set_word.append(data_tuple[0])
    data_set_label.append(data_tuple[1])
torch_dataset = Data.TensorDataset(torch.tensor(data_set_word, dtype=torch.long), torch.tensor(data_set_label, dtype=torch.long))
# 把 dataset 放入 DataLoader
loader = Data.DataLoader(
    dataset=torch_dataset,  # torch TensorDataset format
    batch_size=batch_size,  # mini batch size
    shuffle=True,  #
    num_workers=2,  # 多線程來讀數(shù)據(jù)
)
 
# 訓練過程
for epoch in range(200):
    for step, (batch_x, batch_y) in enumerate(loader):
        # 梯度清零
        model.zero_grad()
        tag_scores = model(batch_x)
 
        # 計算損失
        tag_scores = tag_scores.view(-1, tag_scores.shape[2])
        batch_y = batch_y.view(batch_y.shape[0]*batch_y.shape[1])
        loss = loss_function(tag_scores, batch_y)
        print(loss)
        # 后向傳播
        loss.backward()
 
        # 更新參數(shù)
        optimizer.step()
 
# 測試過程
with torch.no_grad():
    inputs = torch.tensor([data_set_word[0]], dtype=torch.long)
    print(inputs)
    tag_scores = model.predict(inputs)
    print(tag_scores.shape)
    print(torch.argmax(tag_scores, dim=2))

補充:PyTorch基礎-使用LSTM神經(jīng)網(wǎng)絡實現(xiàn)手寫數(shù)據(jù)集識別

看代碼吧~

import numpy as np
import torch
from torch import nn,optim
from torch.autograd import Variable
from torchvision import datasets,transforms
from torch.utils.data import DataLoader
# 訓練集
train_data = datasets.MNIST(root="./", # 存放位置
                            train = True, # 載入訓練集
                            transform=transforms.ToTensor(), # 把數(shù)據(jù)變成tensor類型
                            download = True # 下載
                           )
# 測試集
test_data = datasets.MNIST(root="./",
                            train = False,
                            transform=transforms.ToTensor(),
                            download = True
                           )
# 批次大小
batch_size = 64
# 裝載訓練集
train_loader = DataLoader(dataset=train_data,batch_size=batch_size,shuffle=True)
# 裝載測試集
test_loader = DataLoader(dataset=test_data,batch_size=batch_size,shuffle=True)
for i,data in enumerate(train_loader):
    inputs,labels = data
    print(inputs.shape)
    print(labels.shape)
    break
# 定義網(wǎng)絡結構
class LSTM(nn.Module):
    def __init__(self):
        super(LSTM,self).__init__()# 初始化
        self.lstm = torch.nn.LSTM(
            input_size = 28, # 表示輸入特征的大小
            hidden_size = 64, # 表示lstm模塊的數(shù)量
            num_layers = 1, # 表示lstm隱藏層的層數(shù)
            batch_first = True # lstm默認格式input(seq_len,batch,feature)等于True表示input和output變成(batch,seq_len,feature)
        )
        self.out = torch.nn.Linear(in_features=64,out_features=10)
        self.softmax = torch.nn.Softmax(dim=1)
    def forward(self,x):
        # (batch,seq_len,feature)
        x = x.view(-1,28,28)
        # output:(batch,seq_len,hidden_size)包含每個序列的輸出結果
        # 雖然lstm的batch_first為True,但是h_n,c_n的第0個維度還是num_layers
        # h_n :[num_layers,batch,hidden_size]只包含最后一個序列的輸出結果
        # c_n:[num_layers,batch,hidden_size]只包含最后一個序列的輸出結果
        output,(h_n,c_n) = self.lstm(x)
        output_in_last_timestep = h_n[-1,:,:]
        x = self.out(output_in_last_timestep)
        x = self.softmax(x)
        return x
# 定義模型
model = LSTM()
# 定義代價函數(shù)
mse_loss = nn.CrossEntropyLoss()# 交叉熵
# 定義優(yōu)化器
optimizer = optim.Adam(model.parameters(),lr=0.001)# 隨機梯度下降
# 定義模型訓練和測試的方法
def train():
    # 模型的訓練狀態(tài)
    model.train()
    for i,data in enumerate(train_loader):
        # 獲得一個批次的數(shù)據(jù)和標簽
        inputs,labels = data
        # 獲得模型預測結果(64,10)
        out = model(inputs)
        # 交叉熵代價函數(shù)out(batch,C:類別的數(shù)量),labels(batch)
        loss = mse_loss(out,labels)
        # 梯度清零
        optimizer.zero_grad()
        # 計算梯度
        loss.backward()
        # 修改權值
        optimizer.step()
        
def test():
    # 模型的測試狀態(tài)
    model.eval()
    correct = 0 # 測試集準確率
    for i,data in enumerate(test_loader):
        # 獲得一個批次的數(shù)據(jù)和標簽
        inputs,labels = data
        # 獲得模型預測結果(64,10)
        out = model(inputs)
        # 獲得最大值,以及最大值所在的位置
        _,predicted = torch.max(out,1)
        # 預測正確的數(shù)量
        correct += (predicted==labels).sum()
    print("Test acc:{0}".format(correct.item()/len(test_data)))
    
    correct = 0
    for i,data in enumerate(train_loader): # 訓練集準確率
        # 獲得一個批次的數(shù)據(jù)和標簽
        inputs,labels = data
        # 獲得模型預測結果(64,10)
        out = model(inputs)
        # 獲得最大值,以及最大值所在的位置
        _,predicted = torch.max(out,1)
        # 預測正確的數(shù)量
        correct += (predicted==labels).sum()
    print("Train acc:{0}".format(correct.item()/len(train_data)))
# 訓練
for epoch in range(10):
    print("epoch:",epoch)
    train()
    test()

在這里插入圖片描述

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • pytest實現(xiàn)多進程與多線程運行超好用的插件

    pytest實現(xiàn)多進程與多線程運行超好用的插件

    本文主要介紹了pytest實現(xiàn)多進程與多線程運行超好用的插件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • Django admin組件的使用

    Django admin組件的使用

    這篇文章主要介紹了Django admin組件的使用,幫助大家更好的理解和學習Django框架,感興趣的朋友可以了解下
    2020-10-10
  • python實現(xiàn)搜索本地文件信息寫入文件的方法

    python實現(xiàn)搜索本地文件信息寫入文件的方法

    這篇文章主要介紹了python實現(xiàn)搜索本地文件信息寫入文件的方法,涉及Python針對文件的遍歷及屬性操作相關技巧,需要的朋友可以參考下
    2016-02-02
  • python線程池threadpool使用篇

    python線程池threadpool使用篇

    這篇文章主要為大家詳細介紹了python線程池threadpool的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 深入源碼解析Python中的對象與類型

    深入源碼解析Python中的對象與類型

    這篇文章主要介紹了深入源碼解析Python中的對象與類型,涉及到對象的引用計數(shù)方法和類型的定義等深層次內(nèi)容,需要的朋友可以參考下
    2015-12-12
  • python 對類的成員函數(shù)開啟線程的方法

    python 對類的成員函數(shù)開啟線程的方法

    今天小編就為大家分享一篇python 對類的成員函數(shù)開啟線程的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python3 讀取Word文件方式

    Python3 讀取Word文件方式

    今天小編就為大家分享一篇Python3 讀取Word文件方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python線程之認識線程安全?

    Python線程之認識線程安全?

    這篇文章主要介紹了Python線程之認識線程安全,線程安全,名字就非常直接,在多線程情況下是安全的,多線程操作上的安全,下面學習線程安全的文章詳細內(nèi)容,需要的小伙伴可以參考一下
    2022-02-02
  • python中類的屬性和方法介紹

    python中類的屬性和方法介紹

    在本篇內(nèi)容里小編給大家整理了關于python中類的屬性知識點以及使用方法介紹,需要的朋友們參考下。
    2018-11-11
  • Python實現(xiàn)去除列表中重復元素的方法總結【7種方法】

    Python實現(xiàn)去除列表中重復元素的方法總結【7種方法】

    今天小編就為大家分享一篇關于Python實現(xiàn)去除列表中重復元素的方法總結【7種方法】,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02

最新評論

郓城县| 临沂市| 简阳市| 信丰县| 扶绥县| 武功县| 固阳县| 牙克石市| 敦化市| 大余县| 石台县| 新余市| 金湖县| 运城市| 那曲县| 德昌县| 仙居县| 民和| 黑河市| 大庆市| 杭锦旗| 阳西县| 迁西县| 克什克腾旗| 兴业县| 阜新| 海盐县| 凤山县| 南华县| 新和县| 于都县| 昌邑市| 军事| 涿鹿县| 大同县| 松原市| 临泉县| 南城县| 濉溪县| 怀柔区| 夏河县|