Недостаточно оперативной памяти при преобразовании списка в список с горячим кодированием в Google Colab

Я пытаюсь реализовать word2vec с помощью skipgram с нуля и застрял на создании входного слоя.

class SkipGramBatcher:
  def __init__(self, text):
    self.text = text.results

  def get_batches(self, batch_size):
    n_batches = len(self.text)//batch_size
    pairs = []


    for idx in range(0, len(self.text)):
      window_size = 5
      idx_neighbors = self._get_neighbors(self.text, idx, window_size)
      idx_pairs = [(idx,idx_neighbor) for idx_neighbor in idx_neighbors]
      pairs.extend(idx_pairs)


    for idx in range(0, len(pairs), batch_size):
      X = [pair[0] for pair in pairs[idx:idx+batch_size]]
      Y = [pair[1] for pair in pairs[idx:idx+batch_size]]
      yield X,Y

  def _get_neighbors(self, text, idx, window_size):
    text_length = len(text)
    start = max(idx-window_size,0)
    end = min(idx+window_size+1,text_length)
    neighbors_words = set(text[start:end])

    return list(neighbors_words)

В целях тестирования я ограничил свой vocab_size до 1000 слов. Когда я пытаюсь проверить свой SkipGramBatcher, у меня заканчивается свободная оперативная память, и мой колаб перезапускается.

for x,y in skip_gram_batcher.get_batches(64):
  x_ohe = to_one_hot(x)
  y_ohe = to_one_hot(y)
  print(x_one.shape, y_ohe.shape) 

def to_one_hot(indexes):
  n_values = np.max(indexes) + 1
  return np.eye(n_values)[indexes]

Я думаю, что я делаю что-то не так, любая помощь приветствуется.

Сообщение Google Colab:

Mar 5, 2019, 4:47:33 PM WARNING WARNING:root:kernel fee9eac6-2adf-4c31-9187-77e8018e2eae restarted
Mar 5, 2019, 4:47:33 PM INFO    KernelRestarter: restarting kernel (1/5), keep random ports
Mar 5, 2019, 4:47:23 PM WARNING tcmalloc: large alloc 66653388800 bytes == 0x27b4c000 @ 0x7f4533736001 0x7f4527e29b85 0x7f4527e8cb43 0x7f4527e8ea86 0x7f4527f26868 0x5030d5 0x507641 0x504c28 0x502540 0x502f3d 0x506859 0x502209 0x502f3d 0x506859 0x504c28 0x511eca 0x502d6f 0x506859 0x504c28 0x502540 0x502f3d 0x506859 0x504c28 0x502540 0x502f3d 0x507641 0x504c28 0x501b2e 0x591461 0x59ebbe 0x507c17
Mar 5, 2019, 4:39:43 PM INFO    Adapting to protocol v5.1 for kernel fee9eac6-2adf-4c31-9187-77e8018e2eae

person Daniel Chepenko    schedule 05.03.2019    source источник
comment
Какую ошибку вы получаете? Трассировка стека была бы полезна.   -  person sophros    schedule 05.03.2019
comment
@Hari_Sheldon нет, только один коллаб за раз   -  person Daniel Chepenko    schedule 05.03.2019
comment
@sophros проверьте обновление, пожалуйста   -  person Daniel Chepenko    schedule 05.03.2019
comment
@Hari_Sheldon спасибо, я раньше этого не замечал. Но тем не менее, удаление переменной word не решило проблему   -  person Daniel Chepenko    schedule 05.03.2019


Ответы (1)


Кажется, я понял, почему Google Colab выделяет колоссальные 66 ГБ для вашей программы.

Поскольку X выделяется размер пакета элементов

X = [pair[0] for pair in pairs[idx:idx+batch_size]]

при преобразовании в one_hot_encoding

  n_values = np.max(indexes) + 1
  return np.eye(n_values)[indexes]

X присваивается матрица размерности (64,64) и, поскольку индексы также взяты из (0:63). По сути, он возвращает матрицу (64,64).

Предупреждение. – Это относится только к x, учитывая также и y.

Теперь повторите этот процесс примерно N раз. Каждый раз, когда X и Y являются (64,64) матрицами, а также есть переменная pairs, которая также представляет собой большой список, поэтому память продолжает увеличиваться.

Подсказка: Y — это список строк, и np.max(Y) не может быть выполнено.

person Justice_Lords    schedule 05.03.2019
comment
Я вижу, я думаю, ты прав. Что вы можете предложить в таком случае? Вместо этого я подумал об использовании tf.one_hot в качестве первой операции при повторении пакетов. А затем передать результат в мою нейронную сеть - person Daniel Chepenko; 05.03.2019
comment
@DanielChepenko Я не знаком с tensorflow. Но я думаю, что использование встроенных команд tensorflow будет полезным. Поскольку они оптимизированы и, таким образом, могут сэкономить время и место. - person Justice_Lords; 05.03.2019