У меня есть следующий фрагмент для обучения модели классификации текста. Я немного оптимизировал его, и он работает довольно гладко, однако он по-прежнему использует много оперативной памяти. Наш набор данных огромен (13 миллионов документов + 18 миллионов слов в словаре), но точка выполнения, выдающая ошибку, на мой взгляд, очень странная. Сценарий:
encoder = LabelEncoder()
y = encoder.fit_transform(categories)
classes = list(range(0, len(encoder.classes_)))
vectorizer = CountVectorizer(vocabulary=vocabulary,
binary=True,
dtype=numpy.int8)
classifier = SGDClassifier(loss='modified_huber',
n_jobs=-1,
average=True,
random_state=1)
tokenpath = modelpath.joinpath("tokens")
for i in range(0, len(batches)):
token_matrix = joblib.load(
tokenpath.joinpath("{}.pickle".format(i)))
batchsize = len(token_matrix)
classifier.partial_fit(
vectorizer.transform(token_matrix),
y[i * batchsize:(i + 1) * batchsize],
classes=classes
)
joblib.dump(classifier, modelpath.joinpath('classifier.pickle'))
joblib.dump(vectorizer, modelpath.joinpath('vectorizer.pickle'))
joblib.dump(encoder, modelpath.joinpath('category_encoder.pickle'))
joblib.dump(options, modelpath.joinpath('extraction_options.pickle'))
Я получил MemoryError в этой строке:
joblib.dump(vectorizer, modelpath.joinpath('vectorizer.pickle'))
На этом этапе выполнения обучение завершено, и классификатор уже сброшен. Он должен быть собран сборщиком мусора на случай, если потребуется больше памяти. Кроме того, зачем joblib выделять столько памяти, если она даже не сжимает данные< /а>.
У меня нет глубоких знаний о внутренней работе сборщика мусора Python. Должен ли я заставлять gc.collect() или использовать 'del' статусы, чтобы освободить те объекты, которые больше не нужны?
Обновление:
Я попытался использовать HashingVectorizer, и хотя он значительно сокращает использование памяти, векторизация выполняется намного медленнее, что делает его не очень хорошей альтернативой.
Мне нужно настроить векторизатор, чтобы позже использовать его в процессе классификации, чтобы я мог сгенерировать разреженную матрицу, которая передается классификатору. Я опубликую здесь свой классификационный код:
extracted_features = joblib.Parallel(n_jobs=-1)(
joblib.delayed(features.extractor) (d, extraction_options) for d in documents)
probabilities = classifier.predict_proba(
vectorizer.transform(extracted_features))
predictions = category_encoder.inverse_transform(
probabilities.argmax(axis=1))
trust = probabilities.max(axis=1)
HashingVectorizer
вместо этого? Какой у тебя типvocabulary
? Зачем вообще нужно травить векторизатор? - person krassowski   schedule 29.03.2018