Обучите модель глубокого обучения порциями/последовательно, чтобы избежать ошибки памяти.

Вопрос или проблема

Как мне обучить/адаптировать модель по частям, чтобы избежать ужасной ошибки памяти?

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). Это говорит о том, что вы находитесь на грани возможностей вашей системы. Решение заключается в том, чтобы разбить процесс обучения на более управляемые части.

Подход к решению

  1. Чтение данных по частям: Использование pandas для загрузки данных с опцией chunksize. Это позволяет вам загружать и обрабатывать данные по небольшим частям, что экономит память.

  2. Обработка данных в мини-батчах: Вместо того чтобы загружать все предварительно обработанные данные в память, вы можете обрабатывать каждую часть данных и обновлять модель поочередно.

  3. Использование генераторов 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, вы сможете избежать ошибок памяти и эффективно полностью изменить модель. Надеюсь, что это руководство поможет вам оптимизировать ваш процесс обучения и справиться с проблемами нехватки памяти.

Оцените материал
Добавить комментарий

Капча загружается...