婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 解決pytorch rnn 變長輸入序列的問題

解決pytorch rnn 變長輸入序列的問題

熱門標簽:400電話辦理哪種 地圖標注線上如何操作 手機網頁嵌入地圖標注位置 天津電話機器人公司 電銷機器人的風險 應電話機器人打電話違法嗎 開封語音外呼系統代理商 開封自動外呼系統怎么收費 河北防封卡電銷卡

pytorch實現變長輸入的rnn分類

輸入數據是長度不固定的序列數據,主要講解兩個部分

1、Data.DataLoader的collate_fn用法,以及按batch進行padding數據

2、pack_padded_sequence和pad_packed_sequence來處理變長序列

collate_fn

Dataloader的collate_fn參數,定義數據處理和合并成batch的方式。

由于pack_padded_sequence用到的tensor必須按照長度從大到小排過序的,所以在Collate_fn中,需要完成兩件事,一是把當前batch的樣本按照當前batch最大長度進行padding,二是將padding后的數據從大到小進行排序。

def pad_tensor(vec, pad):
    """
    args:
        vec - tensor to pad
        pad - the size to pad to
    return:
        a new tensor padded to 'pad'
    """
    return torch.cat([vec, torch.zeros(pad - len(vec), dtype=torch.float)], dim=0).data.numpy()
class Collate:
    """
    a variant of callate_fn that pads according to the longest sequence in
    a batch of sequences
    """
    def __init__(self):
        pass
    def _collate(self, batch):
        """
        args:
            batch - list of (tensor, label)
        reutrn:
            xs - a tensor of all examples in 'batch' before padding like:
                '''
                [tensor([1,2,3,4]),
                 tensor([1,2]),
                 tensor([1,2,3,4,5])]
                '''
            ys - a LongTensor of all labels in batch like:
                '''
                [1,0,1]
                '''
        """
        xs = [torch.FloatTensor(v[0]) for v in batch]
        ys = torch.LongTensor([v[1] for v in batch])
        # 獲得每個樣本的序列長度
        seq_lengths = torch.LongTensor([v for v in map(len, xs)])
        max_len = max([len(v) for v in xs])
        # 每個樣本都padding到當前batch的最大長度
        xs = torch.FloatTensor([pad_tensor(v, max_len) for v in xs])
        # 把xs和ys按照序列長度從大到小排序
        seq_lengths, perm_idx = seq_lengths.sort(0, descending=True)
        xs = xs[perm_idx]
        ys = ys[perm_idx]
        return xs, seq_lengths, ys
    def __call__(self, batch):
        return self._collate(batch)

定義完collate類以后,在DataLoader中直接使用

train_data = Data.DataLoader(dataset=train_dataset, batch_size=32, num_workers=0, collate_fn=Collate())

torch.nn.utils.rnn.pack_padded_sequence()

pack_padded_sequence將一個填充過的變長序列壓緊。輸入參數包括

input(Variable)- 被填充過后的變長序列組成的batch data

lengths (list[int]) - 變長序列的原始序列長度

batch_first (bool,optional) - 如果是True,input的形狀應該是(batch_size,seq_len,input_size)

返回值:一個PackedSequence對象,可以直接作為rnn,lstm,gru的傳入數據。

用法:

from torch.nn.utils.rnn import pack_padded_sequence, pad_packed_sequence
# x是填充過后的batch數據,seq_lengths是每個樣本的序列長度
packed_input = pack_padded_sequence(x, seq_lengths, batch_first=True)

RNN模型

定義了一個單向的LSTM模型,因為處理的是變長序列,forward函數傳入的值是一個PackedSequence對象,返回值也是一個PackedSequence對象

class Model(nn.Module):
    def __init__(self, in_size, hid_size, n_layer, drop=0.1, bi=False):
        super(Model, self).__init__()
        self.lstm = nn.LSTM(input_size=in_size,
                            hidden_size=hid_size,
                            num_layers=n_layer,
                            batch_first=True,
                            dropout=drop,
                            bidirectional=bi)
        # 分類類別數目為2
        self.fc = nn.Linear(in_features=hid_size, out_features=2)
    def forward(self, x):
        '''
        :param x: 變長序列時,x是一個PackedSequence對象
        :return: PackedSequence對象
        '''
        # lstm_out: tensor of shape (batch, seq_len, num_directions * hidden_size)
        lstm_out, _ = self.lstm(x)  
        
        return lstm_out
model = Model()
lstm_out = model(packed_input)

torch.nn.utils.rnn.pad_packed_sequence()

這個操作和pack_padded_sequence()是相反的,把壓緊的序列再填充回來。因為前面提到的LSTM模型傳入和返回的都是PackedSequence對象,所以我們如果想要把返回的PackedSequence對象轉換回Tensor,就需要用到pad_packed_sequence函數。

參數說明:

sequence (PackedSequence) – 將要被填充的 batch

batch_first (bool, optional) – 如果為True,返回的數據的形狀為(batch_size,seq_len,input_size)

返回值: 一個tuple,包含被填充后的序列,和batch中序列的長度列表。

用法:

# 此處lstm_out是一個PackedSequence對象
output, _ = pad_packed_sequence(lstm_out)

返回的output是一個形狀為(batch_size,seq_len,input_size)的tensor。

總結

1、pytorch在自定義dataset時,可以在DataLoader的collate_fn參數中定義對數據的變換,操作以及合成batch的方式。

2、處理變長rnn問題時,通過pack_padded_sequence()將填充的batch數據轉換成PackedSequence對象,直接傳入rnn模型中。通過pad_packed_sequence()來將rnn模型輸出的PackedSequence對象轉換回相應的Tensor。

補充:pytorch實現不定長輸入的RNN / LSTM / GRU

情景描述

As we all know,RNN循環神經網絡(及其改進模型LSTM、GRU)可以處理序列的順序信息,如人類自然語言。但是在實際場景中,我們常常向模型輸入一個批次(batch)的數據,這個批次中的每個序列往往不是等長的。

pytorch提供的模型(nn.RNN,nn.LSTM,nn.GRU)是支持可變長序列的處理的,但條件是傳入的數據必須按序列長度排序。本文針對以下兩種場景提出解決方法。

1、每個樣本只有一個序列:(seq,label),其中seq是一個長度不定的序列。則使用pytorch訓練時,我們將按列把一個批次的數據輸入網絡,seq這一列的形狀就是(batch_size, seq_len),經過編碼層(如word2vec)之后的形狀是(batch_size, seq_len, emb_size)。

2、情況1的拓展:每個樣本有兩個(或多個)序列,如(seq1, seq2, label)。這種樣本形式在問答系統、推薦系統多見。

通用解決方案

定義ImprovedRnn類。與nn.RNN,nn.LSTM,nn.GRU相比,除了此兩點【①forward函數多一個參數lengths表示每個seq的長度】【②初始化函數(__init__)第一個參數module必須指定三者之一】外,使用方法完全相同。

import torch
from torch import nn
class ImprovedRnn(nn.Module):
    def __init__(self, module, *args, **kwargs):
        assert module in (nn.RNN, nn.LSTM, nn.GRU)
        super().__init__()
        self.module = module(*args, **kwargs)
    def forward(self, input, lengths):  # input shape(batch_size, seq_len, input_size)
        if not hasattr(self, '_flattened'):
            self.module.flatten_parameters()
            setattr(self, '_flattened', True)
        max_len = input.shape[1]
        # enforce_sorted=False則自動按lengths排序,并且返回值package.unsorted_indices可用于恢復原順序
        package = nn.utils.rnn.pack_padded_sequence(input, lengths.cpu(), batch_first=self.module.batch_first, enforce_sorted=False)
        result, hidden = self.module(package)
        # total_length參數一般不需要,因為lengths列表中一般含最大值。但分布式訓練時是將一個batch切分了,故一定要有!
        result, lens = nn.utils.rnn.pad_packed_sequence(result, batch_first=self.module.batch_first, total_length=max_len)
        return result[package.unsorted_indices], hidden  # output shape(batch_size, seq_len, rnn_hidden_size)

使用示例:

class TestNet(nn.Module):
    def __init__(self, word_emb, gru_in, gru_out):
        super().__init__()
        self.encode = nn.Embedding.from_pretrained(torch.Tensor(word_emb))
        self.rnn = ImprovedRnn(nn.RNN, input_size=gru_in, hidden_size=gru_out,
		        				batch_first=True, bidirectional=True)
    def forward(self, seq1, seq1_lengths, seq2, seq2_lengths):
        seq1_emb = self.encode(seq1)
        seq2_emb = self.encode(seq2)
        rnn1, hn = self.rnn(seq1_emb, seq1_lengths)
        rnn2, hn = self.rnn(seq2_emb, seq2_lengths)
        """
        此處略去rnn1和rnn2的后續計算,當前網絡最后計算結果記為prediction
        """
        return prediction

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

您可能感興趣的文章:
  • Pytorch DataLoader 變長數據處理方式
  • pytorch-RNN進行回歸曲線預測方式
  • 基于pytorch的lstm參數使用詳解
  • Pytorch實現基于CharRNN的文本分類與生成示例

標簽:駐馬店 成都 蘭州 六盤水 江蘇 山東 宿遷 常州

巨人網絡通訊聲明:本文標題《解決pytorch rnn 變長輸入序列的問題》,本文關鍵詞  解決,pytorch,rnn,變長,輸入,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《解決pytorch rnn 變長輸入序列的問題》相關的同類信息!
  • 本頁收集關于解決pytorch rnn 變長輸入序列的問題的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品一区二区久激情瑜伽| 亚洲黄色小视频| 欧美伊人久久大香线蕉综合69| 国产福利一区二区三区在线视频| 国产成人综合在线| 成人性视频免费网站| 国产精品18久久久久久久久| 色婷婷综合久久久| 欧美日本乱大交xxxxx| 日韩一区二区三区四区五区六区| 欧美一级夜夜爽| 日韩视频免费观看高清在线视频| 久久久久久久久久久久久女国产乱| 久久久久久99久久久精品网站| 国产精品灌醉下药二区| 亚洲国产视频一区二区| 国产成都精品91一区二区三| 97aⅴ精品视频一二三区| 欧美日韩亚洲综合一区二区三区| 678五月天丁香亚洲综合网| 久久综合久久鬼色| 亚洲男人天堂av网| 国产伦精品一区二区三区视频青涩 | 91精品欧美综合在线观看最新| 国产视频一区在线播放| 欧美—级在线免费片| 日韩激情一区二区| 91丝袜美腿高跟国产极品老师| 精品国产免费视频| 三级影片在线观看欧美日韩一区二区| 国产精品一区久久久久| 欧美天堂一区二区三区| 亚洲三级小视频| 国产伦精一区二区三区| 精品一区二区日韩| 国产综合色产在线精品| 国产成人av电影在线| 久久久影院官网| 国产伦精一区二区三区| 久久这里只有精品视频网| 麻豆专区一区二区三区四区五区| 欧美撒尿777hd撒尿| 亚洲大型综合色站| 91麻豆精品国产91久久久更新时间 | 成人精品电影在线观看| 欧美韩国日本一区| 91麻豆国产自产在线观看| 一区二区三区精品视频在线| 国产精品理论在线观看| 日韩和欧美的一区| 欧美美女一区二区三区| 精品国产露脸精彩对白| 亚洲婷婷综合久久一本伊一区| 成人午夜精品在线| 国产一区欧美一区| 日韩免费视频一区二区| 亚洲一区二区视频在线| 蜜臀av一级做a爰片久久| 国产高清不卡一区二区| 久久先锋影音av| 欧美日韩国产在线播放网站| 亚洲精选视频免费看| 捆绑紧缚一区二区三区视频| 亚洲国产精品久久艾草纯爱| 久久久久久一级片| 婷婷激情综合网| 日本韩国视频一区二区| 亚洲已满18点击进入久久| 日韩欧美一二三四区| 国产福利91精品| 国产麻豆精品在线观看| 日韩精品一二三四| 69久久夜色精品国产69蝌蚪网| 国产一区二区三区四区五区美女| 亚洲精品va在线观看| 日韩欧美国产系列| eeuss鲁一区二区三区| 日韩精品福利网| 欧美日韩一二区| 久久国产尿小便嘘嘘| 国产午夜精品一区二区三区视频 | 欧美日韩国产高清一区二区三区| 亚洲福利视频一区二区| 91精品欧美久久久久久动漫| 国产在线视视频有精品| 国产精品国产成人国产三级| 日韩一区二区三区观看| 日本福利一区二区| 国产精品一区二区久久精品爱涩| 亚洲va天堂va国产va久| 亚洲一区国产视频| 国产精品国产三级国产| 亚洲欧洲国产日本综合| 国产农村妇女毛片精品久久麻豆 | 一区二区三区在线观看国产| 久久久久99精品国产片| 一本久久综合亚洲鲁鲁五月天| 免费不卡在线观看| 91久久精品网| 成人中文字幕合集| 无吗不卡中文字幕| 国产欧美一区二区精品性色| 日本韩国视频一区二区| 国产精品一区不卡| 日本中文在线一区| 亚洲日本在线看| 免费一级欧美片在线观看| 欧美日韩一区三区四区| 欧美日韩亚洲综合一区| 91麻豆精品国产91久久久久久| 成人av在线播放网址| 青青青伊人色综合久久| 亚洲与欧洲av电影| 国产精品少妇自拍| 性做久久久久久久免费看| 亚洲欧洲日产国码二区| 久久精品一级爱片| 日韩欧美一二三| 欧美一区2区视频在线观看| 91精品国产高清一区二区三区蜜臀| 欧美日韩一区二区三区四区| 在线看日本不卡| 欧美精品v国产精品v日韩精品 | 制服丝袜亚洲精品中文字幕| 欧美精品精品一区| 欧美不卡123| 欧美草草影院在线视频| 精品久久久久久久久久久久久久久久久| 日韩欧美精品三级| 中文子幕无线码一区tr| 亚洲青青青在线视频| 日韩精品一卡二卡三卡四卡无卡| 国产在线国偷精品免费看| 91最新地址在线播放| 欧美日韩国产高清一区| 91麻豆精品国产91久久久久久久久 | 国产成人av电影在线| 在线观看一区二区视频| 日韩精品一区在线观看| 亚洲柠檬福利资源导航| 久久aⅴ国产欧美74aaa| 99久久精品一区| 99精品久久只有精品| 91麻豆精品国产91久久久更新时间 | 粉嫩嫩av羞羞动漫久久久| 精品一区二区在线免费观看| 色综合久久久久综合体| 国产亚洲精久久久久久| 免费观看在线色综合| 97se亚洲国产综合自在线观| 777精品伊人久久久久大香线蕉| 欧美精品一区二区在线播放| 一区二区三区中文字幕| 国产福利不卡视频| 欧美电影一区二区三区| 国产精品区一区二区三区| 亚洲国产精品久久久久秋霞影院| 韩国女主播一区| 欧美日韩精品综合在线| 国产精品久久久久久久久免费桃花 | 欧美日韩久久久久久| 亚洲综合一区二区三区| 国产精品一区三区| 国产片一区二区| 国产69精品久久久久毛片| 欧美精品粉嫩高潮一区二区| 欧美肥妇bbw| 一区二区三区四区五区视频在线观看 | 日韩一区二区三| 国产精品久久久久三级| 寂寞少妇一区二区三区| 黄色成人免费在线| 欧美一区二区福利在线| 亚洲视频1区2区| 99国产一区二区三精品乱码| 国产日韩三级在线| 久久黄色级2电影| 91精品国产品国语在线不卡| 久久国产乱子精品免费女| 日韩欧美视频在线| 国产主播一区二区三区| 久久久久久亚洲综合影院红桃| 国产91精品免费| 亚洲最大色网站| 色天天综合色天天久久| 一区二区欧美在线观看| 欧美三级视频在线观看| 天天色综合成人网| 欧美日韩不卡视频| 亚洲一区二区三区激情| 欧美老女人在线| 日韩精品乱码av一区二区| 欧美美女视频在线观看| 五月天激情综合| 精品久久99ma| 国产精品1区2区| 亚洲欧美另类久久久精品2019| 在线看国产日韩| 久久99国内精品| 久久久久久99久久久精品网站|