Недостаточно ОЗУ при преобразовании списка в список с горячим кодированием в Google Colab - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь реализовать 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, я освобождаюсь из свободной оперативной памяти, и мой colab перезагружается.

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

1 Ответ

2 голосов
/ 05 марта 2019

Мне кажется, я понял, почему 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) матрицами, а также есть переменная пар , которая также является большим списком, и поэтому память продолжает увеличиваться.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...