第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

torchtext BucketIterator最小填充

torchtext BucketIterator最小填充

尚方寶劍之說 2021-04-08 18:39:22
我正在嘗試在torchtext中使用BucketIterator.splits函數(shù)從csv文件中加載數(shù)據(jù)以在CNN中使用。除非我的批處理中最長的句子比最大的過濾器大小短,否則一切都正常。在我的示例中,我使用了大小分別為3、4和5的過濾器,因此,如果最長的句子沒有至少5個單詞,則會出現(xiàn)錯誤。有沒有一種方法可以讓BucketIterator動態(tài)設(shè)置批次的填充,還可以設(shè)置最小填充長度?這是我用于BucketIterator的代碼:train_iter, val_iter, test_iter = BucketIterator.splits((train, val, test), sort_key=lambda x: len(x.text), batch_size=batch_size, repeat=False, device=device)我希望有一種方法可以設(shè)置sort_key或類似的最小長度?我嘗試了這個,但是不起作用:FILTER_SIZES = [3,4,5]train_iter, val_iter, test_iter = BucketIterator.splits((train, val, test), sort_key=lambda x: len(x.text) if len(x.text) >= FILTER_SIZES[-1] else FILTER_SIZES[-1], batch_size=batch_size, repeat=False, device=device) 
查看完整描述

2 回答

?
瀟瀟雨雨

TA貢獻1833條經(jīng)驗 獲得超4個贊

我瀏覽了torchtext源代碼以更好地了解sort_key在做什么,并了解了為什么我的原始想法不起作用。


我不確定這是否是最好的解決方案,但是我想出了一個可行的解決方案。我創(chuàng)建了一個tokenizer函數(shù),如果它比最長的過濾器長度短,則填充文本,然后從那里創(chuàng)建BucketIterator。


FILTER_SIZES = [3,4,5]

spacy_en = spacy.load('en')


def tokenizer(text):

    token = [t.text for t in spacy_en.tokenizer(text)]

    if len(token) < FILTER_SIZES[-1]:

        for i in range(0, FILTER_SIZES[-1] - len(token)):

            token.append('<PAD>')

    return token


TEXT = Field(sequential=True, tokenize=tokenizer, lower=True, tensor_type=torch.cuda.LongTensor)


train_iter, val_iter, test_iter = BucketIterator.splits((train, val, test), sort_key=lambda x: len(x.text), batch_size=batch_size, repeat=False, device=device)


查看完整回答
反對 回復(fù) 2021-04-27
?
墨色風(fēng)雨

TA貢獻1853條經(jīng)驗 獲得超6個贊

盡管@ paul41的方法有效,但還是有些濫用。這樣做的正確方法是使用preprocessing或postprocessing(相應(yīng)地在數(shù)字化之前或之后)。這是一個示例postprocessing:


def get_pad_to_min_len_fn(min_length):

    def pad_to_min_len(batch, vocab, min_length=min_length):

        pad_idx = vocab.stoi['<pad>']

        for idx, ex in enumerate(batch):

            if len(ex) < min_length:

                batch[idx] = ex + [pad_idx] * (min_length - len(ex))

        return batch

    return pad_to_min_len


FILTER_SIZES = [3,4,5]

min_len_padding = get_pad_to_min_len_fn(min_length=max(FILTER_SIZES))


TEXT = Field(sequential=True, use_vocab=True, lower=True, batch_first=True, 

             postprocessing=min_len_padding)

如果在主循環(huán)中定義了嵌套函數(shù)(例如min_length = max(FILTER_SIZES)),則需要將參數(shù)傳遞給內(nèi)部函數(shù),但如果可行,則可以在函數(shù)內(nèi)部對參數(shù)進行硬編碼。


查看完整回答
反對 回復(fù) 2021-04-27
  • 2 回答
  • 0 關(guān)注
  • 502 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號