как сохранить набор данных torchtext? - PullRequest
0 голосов
/ 22 ноября 2018

Я работаю с текстом и использую torchtext.data.Dataset.Создание набора данных занимает значительное количество времени.Для просто запуска программы это все еще приемлемо.Но я хотел бы отладить код факела для нейронной сети.И если python запускается в режиме отладки, создание набора данных занимает примерно 20 минут (!!).Это просто для получения рабочей среды, в которой я могу отлаживать пошаговый код нейронной сети.

Я хотел бы сохранить набор данных, например, с помощью pickle.Этот пример кода взят из здесь , но я удалил все, что не нужно для этого примера:

from torchtext import data
from fastai.nlp import *

PATH = 'data/aclImdb/'

TRN_PATH = 'train/all/'
VAL_PATH = 'test/all/'
TRN = f'{PATH}{TRN_PATH}'
VAL = f'{PATH}{VAL_PATH}'

TEXT = data.Field(lower=True, tokenize="spacy")

bs = 64;
bptt = 70

FILES = dict(train=TRN_PATH, validation=VAL_PATH, test=VAL_PATH)
md = LanguageModelData.from_text_files(PATH, TEXT, **FILES, bs=bs, bptt=bptt, min_freq=10)

with open("md.pkl", "wb") as file:
    pickle.dump(md, file)

Чтобы запустить код, вам нужен набор данных aclImdb, его можно загрузитьс здесь .Распакуйте его в папку data/ рядом с этим фрагментом кода.Код выдает ошибку в последней строке, где используется pickle:

Traceback (most recent call last):
  File "/home/lhk/programming/fastai_sandbox/lesson4-imdb2.py", line 27, in <module>
    pickle.dump(md, file)
TypeError: 'generator' object is not callable

В образцах из fastai часто используется dill вместо pickle.Но это тоже не работает для меня.

Ответы [ 2 ]

0 голосов
/ 31 июля 2019

Вы всегда можете использовать pickle для выгрузки объектов, но имейте в виду, что модуль не позаботится о выгрузке списка объектов словаря или полей, поэтому лучше всего сначала разбить список

Сохранение объекта DataSet в файл рассылки для последующей легкой загрузки

def save_to_pickle(dataSetObject,PATH):
    with open(PATH,'wb') as output:
        for i in dataSetObject:
            pickle.dump(vars(i), output, pickle.HIGHEST_PROTOCOL)

Самое сложное еще впереди, ага, загрузка файла рассылки ....;)

Сначала попробуйте найти все имена полей и атрибуты полей, а затем перейдите к kill

Чтобы загрузить файл pickle в DataSetObject

def load_pickle(PATH, FIELDNAMES, FIELD):
    dataList = []
    with open(PATH, "rb") as input_file:
        while True:
            try:
                # Taking the dictionary instance as the input Instance
                inputInstance = pickle.load(input_file)
                # plugging it into the list
                dataInstance =  [inputInstance[FIELDNAMES[0]],inputInstance[FIELDNAMES[1]]]
                # Finally creating an example objects list
                dataList.append(Example().fromlist(dataInstance,fields=FIELD))
            except EOFError:
                break

    # At last creating a data Set Object
    exampleListObject = Dataset(dataList, fields=data_fields)
    return exampleListObject 

Это хакерское решение сработало в моем случаеНадеюсь, вы найдете это полезным и в вашем случае.

Кстати, любые предложения приветствуются:).

0 голосов
/ 29 января 2019

Вы можете использовать укроп вместо маринада.Меня устраивает.Вы можете сохранить поле текста факела, например

TEXT = data.Field(sequential=True, tokenize=tokenizer, lower=True,fix_length=200,batch_first=True)
with open("model/TEXT.Field","wb")as f:
     dill.dump(TEXT,f)

, и загрузить поле типа

with open("model/TEXT.Field","rb")as f:
     TEXT=dill.load(f)

Поддержка официального кода находится в стадии разработки , вы можете следовать https://github.com/pytorch/text/issues/451 и https://github.com/pytorch/text/issues/73.

...