Загружайте одну часть набора данных одновременно в Керасе - PullRequest
0 голосов
/ 16 апреля 2020

У меня большой набор данных, изначально его размер равен (453732,839). В этом наборе данных у меня есть подгруппы, которые связаны друг с другом, и эти подгруппы имеют переменное измерение. Поскольку я должен обучать LSTM, каждая подгруппа должна быть одинакового размера, поэтому я применяю отступы к каждой подгруппе, чтобы они все были одинаковой длины. После дополнения набор данных становится примерно 2000000 строками.

Так что я выполняю функцию model.fit() в al oop, где model.fit() выполняется по одному для каждой части набора данных. Внутри l oop я добавляю в сеть часть набора данных, чтобы перейти к model.fit(), но во второй части, до того, как model.fit() заполнится, RAM не заполнится, и я не смогу продолжить обучение.

Это код, в котором я pad и fit модель:

training_set_portion_size = int(training_dataset.shape[0] / 6)
start_portion_index = 0

for epoch in range(0, 50):
      for part in range(0, 4):
        end_portion_index = start_portion_index + training_set_portion_size
        training_set_portion = training_dataset[start_portion_index:end_portion_index]
        training_set_portion_labels = training_set_portion[:, training_set_portion.shape[1]-1]
        portion_groups = get_groups_id_count(training_set_portion[:,0])
        # Scale dataset portion
        training_set_portion = scaler.transform(training_set_portion[:,0:training_set_portion.shape[1]-1])
        training_set_portion = np.concatenate((training_set_portion, training_set_portion_labels[:, np.newaxis]), axis=1)
        # Pad dataset portion
        training_set_portion = pad_groups(training_set_portion, portion_groups)
        training_set_portion_labels = training_set_portion[:, training_set_portion.shape[1]-1]
        # Exluding group and label from training_set_portion
        training_set_portion = training_set_portion[:, 1:training_set_portion.shape[1] - 1]
        # Reshape data for LSTM
        training_set_portion = training_set_portion.reshape(int(training_set_portion.shape[0]/timesteps), timesteps, features)
        training_set_portion_labels = training_set_portion_labels.reshape(int(training_set_portion_labels.shape[0]/timesteps), timesteps)
        model.fit(training_set_portion, training_set_portion_labels, validation_split=0.2, shuffle=False, epochs=1, 
                  batch_size=1, workers=0, max_queue_size=1, verbose=1)

* ** ОБНОВЛЕНИЕ ***

I ' m, используя pandas сейчас, с chunksize, но кажется, что тензоры объединяются в итераторе l oop.

pandas:

training_dataset_iterator = pd.read_csv('/content/drive/My Drive/Tesi_magistrale/en-train.H', 
                                        chunksize=80000, sep=",", header=None, dtype=np.float64)

Новый код:

for epoch in range(0, 50):
      for chunk in training_dataset_iterator:
        training_set_portion = chunk.values
        training_set_portion_labels = training_set_portion[:, training_set_portion.shape[1]-1]
        portion_groups = get_groups_id_count(training_set_portion[:,0])
        # Scale dataset portion
        training_set_portion = scaler.transform(training_set_portion[:,0:training_set_portion.shape[1]-1])
        training_set_portion = np.concatenate((training_set_portion, training_set_portion_labels[:, np.newaxis]), axis=1)
        # Pad dataset portion
        print('Padding portion...\n')
        training_set_portion = pad_groups(training_set_portion, portion_groups)
        training_set_portion_labels = training_set_portion[:, training_set_portion.shape[1]-1]
        # Exluding group and label from training_set_portion
        training_set_portion = training_set_portion[:, 1:training_set_portion.shape[1] - 1]
        # Reshape data for LSTM
        training_set_portion = training_set_portion.reshape(int(training_set_portion.shape[0]/timesteps), timesteps, features)
        training_set_portion_labels = training_set_portion_labels.reshape(int(training_set_portion_labels.shape[0]/timesteps), timesteps)
        print('Training set portion shape: ', training_set_portion.shape)
        model.fit(training_set_portion, training_set_portion_labels, validation_split=0.2, shuffle=False, epochs=1, 
                  batch_size=1, workers=0, max_queue_size=1, verbose=1)

Первое print('Training set portion shape: ', training_set_portion.shape) дало мне (21327, 20, 837), а второе (43194, 20, 837). Я не понимаю, почему.

ОБНОВЛЕНИЕ 2

Я заметил, что training_set_portion = pad_groups(training_set_portion, portion_groups), в некотором роде, дублирует данные.

Код группы пэдов :

def pad_groups(dataset, groups):
    max_subtree_length= 20
    start = 0
    rows, cols = dataset.shape
    padded_dataset = []
    index = 1
    for group in groups:
      pad = [group[0]] + [0] * (cols - 1)
      stop = start + group[1]
      subtree = dataset[start:stop].tolist()
      padded_dataset.extend(subtree)
      subtree_to_pad = max_subtree_length - group[1]
      pads = [pad] * subtree_to_pad
      padded_dataset.extend(pads)
      start = stop
      index+=1
    padded_dataset = np.array(padded_dataset)
    return padded_dataset

Как я могу это сделать? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Я нашел ссылку в TowardsDataScience, где они показывают 3 метода решения этой проблемы с помощью небольшой библиотеки под названием pandas, которая широко используется для обработки наборов данных. Я надеюсь, что это поможет решить вашу проблему. Вот ссылка: -

https://towardsdatascience.com/3-simple-ways-to-handle-large-data-with-pandas-d9164a3c02c1

С уважением, Нил Гупта

0 голосов
/ 16 апреля 2020

Я решил свои проблемы: в моем коде была ошибка.

...