Вопрос или проблема
Как мне обучить/адаптировать модель по частям, чтобы избежать ужасной ошибки памяти?
def TFIDF(X_train, X_test, MAX_NB_WORDS=75000):
vectorizer_x = TfidfVectorizer(max_features=MAX_NB_WORDS)
X_train = vectorizer_x.fit_transform(X_train).toarray()
X_test = vectorizer_x.transform(X_test).toarray()
print("tf-idf с", str(np.array(X_train).shape[1]), "признаками")
return (X_train, X_test)
# In[3]:
def Build_Model_DNN_Text(shape, nClasses, dropout=0.5):
"""
buildModel_DNN_Tex(shape, nClasses,dropout)
Создание модели глубоких нейронных сетей для классификации текста
shape - входное пространство признаков
nClasses - количество классов
"""
model = Sequential()
node = 512 # количество узлов
nLayers = 4 # количество скрытых слоев
model.add(Dense(node, input_dim=shape, activation='relu'))
model.add(Dropout(dropout))
for i in range(0, nLayers):
model.add(Dense(node, input_dim=node, activation='relu'))
model.add(Dropout(dropout))
model.add(Dense(nClasses, activation='softmax'))
model.compile(loss="sparse_categorical_crossentropy",
optimizer="adam",
metrics=['accuracy'])
return model
# In[18]:
df = pd.read_csv("ExtractedData.csv")
# In[19]:
df = df.dropna()
X_train, X_test, y_train, y_test = train_test_split(df['body'], df['user_id'],
test_size=0.3, random_state=42, shuffle=True)
X_train_tfidf, X_test_tfidf = TFIDF(X_train, X_test)
y_train_tfidf, y_test_tfidf = TFIDF(y_train,y_test)
output_nodes = len(list(set(df['user_id'])))
model_DNN = Build_Model_DNN_Text(X_train_tfidf.shape[1], output_nodes)
model_DNN.fit(X_train_tfidf, y_train_tfidf,
validation_data=(X_test_tfidf, y_test_tfidf),
epochs=10,
batch_size=256,
verbose=2)
predicted = model_DNN.predict(X_test_tfidf)
print(metrics.classification_report(y_test, predicted))
Когда я запускаю вышеуказанное, я постоянно получаю ошибку памяти: Не удалось выделить 37.9 GiB для массива с формой (67912, 75000) и типом данных float64. Я знаю, что могу отправить данные по частям через pd.read_csv( , chunksize= 5000), но что я не знаю, так это как это реализовать здесь. У меня в данных 98000 строк и 4 столбца. Спасибо.
Pandas не эффективен по памяти для загрузки данных.
Похоже, вы используете пакет Keras / TensorFlow. Лучше использовать загрузку данных из csv этого пакета, которая лучше управляет памятью.
Ответ или решение
Обучение модели глубокого обучения по частям для избежания ошибок памяти
Обучение модели глубокого обучения с большими объемами данных может стать проблемой, если ваш компьютер не располагает достаточным объёмом оперативной памяти. В этой статье мы рассмотрим, как обучить модель по частям, чтобы избежать ошибок, связанных с нехваткой памяти, и при этом сохранить целостность процесса обучения.
Проблема
Вы столкнулись с ошибкой памяти при попытке загрузить и обработать данные размером 37,9 GiB для массива с формой (67912, 75000). Это говорит о том, что вы находитесь на грани возможностей вашей системы. Решение заключается в том, чтобы разбить процесс обучения на более управляемые части.
Подход к решению
-
Чтение данных по частям: Использование
pandas
для загрузки данных с опциейchunksize
. Это позволяет вам загружать и обрабатывать данные по небольшим частям, что экономит память. -
Обработка данных в мини-батчах: Вместо того чтобы загружать все предварительно обработанные данные в память, вы можете обрабатывать каждую часть данных и обновлять модель поочередно.
-
Использование генераторов Keras: Keras позволяет использовать генераторы для передачи данных в модель в процессе обучения. Это особенно эффективно для работы с большими наборами данных.
Реализация
Рассмотрим, как можно применить указанные подходы с Вашим кодом.
Шаг 1: Чтение данных по частям
Замените прямое чтение данных через pd.read_csv
на использование chunksize
:
import pandas as pd
chunks = pd.read_csv("ExtractedData.csv", chunksize=5000)
data = pd.concat(chunks, ignore_index=True) # Объединяем части, если это возможно
# Обработка данных
df = data.dropna()
Шаг 2: Функция для обработки и обучения на чанках
Создайте функцию, которая будет обрабатывать и обучать модель на каждой части данных. Мы будем использовать TF-IDF в контексте каждой части:
from sklearn.feature_extraction.text import TfidfVectorizer
from keras.models import Sequential
from keras.layers import Dense, Dropout
from sklearn.model_selection import train_test_split
from sklearn import metrics
def process_chunk(X_chunk, y_chunk, model):
# Применяем TF-IDF
vectorizer = TfidfVectorizer(max_features=75000)
X_tfidf = vectorizer.fit_transform(X_chunk).toarray()
# Обучаем модель на чанке
model.fit(X_tfidf, y_chunk, epochs=10, batch_size=256, verbose=2)
Шаг 3: Использование генераторов для работы с данными
Если вам нужно полностью избежать загрузки данных в память, вы можете использовать генераторы:
def data_generator(file_path, batch_size=5000):
for chunk in pd.read_csv(file_path, chunksize=batch_size):
X_chunk, y_chunk = chunk['body'], chunk['user_id']
yield X_chunk, y_chunk
model_DNN = Build_Model_DNN_Text(X_train_tfidf.shape[1], output_nodes)
for X_chunk, y_chunk in data_generator("ExtractedData.csv"):
X_tfidf_chunk = vectorizer.fit_transform(X_chunk).toarray()
model_DNN.fit(X_tfidf_chunk, y_chunk, epochs=10, batch_size=256, verbose=2)
Заключение
Обучение модели глубокого обучения на больших наборах данных может быть Challenging, но с правильными подходами, такими как обработка данных по частям и использование генераторов TensorFlow/Keras, вы сможете избежать ошибок памяти и эффективно полностью изменить модель. Надеюсь, что это руководство поможет вам оптимизировать ваш процесс обучения и справиться с проблемами нехватки памяти.