Построение набора обучающих данных для алгоритма скипграммы (Udacity Deep Models for Texts, Задание 5) - PullRequest
0 голосов
/ 04 апреля 2019

Я новичок в машинном обучении и пытаюсь понять курс Udacity Deep Models for Text (Задание 5). Я не понимаю, где набор обучающих данных для алгоритма скипграмм меняется на разных итерациях.

Я пытался переписать свой собственный код, но я понятия не имею, как сделать так, чтобы данные обучения менялись для каждой итерации обучения. Поэтому каждый раз, когда я запускаю тренинг, он будет тренироваться с одними и теми же словами, а не охватывать весь словарный запас.

Это оригинальный код Udacity для генерации обучающего набора данных:

data_index = 0

def generate_batch(batch_size, num_skips, skip_window):
global data_index
  assert batch_size % num_skips == 0
  assert num_skips <= 2 * skip_window
  batch = np.ndarray(shape=(batch_size), dtype=np.int32)
  labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)
  span = 2 * skip_window + 1 # [ skip_window target skip_window ]
  buffer = collections.deque(maxlen=span)
  for _ in range(span):
    buffer.append(data[data_index])
    data_index = (data_index + 1) % len(data)
  for i in range(batch_size // num_skips):
    target = skip_window  # target label at the center of the buffer
    targets_to_avoid = [ skip_window ]
    for j in range(num_skips):
      while target in targets_to_avoid:
        target = random.randint(0, span - 1)
      targets_to_avoid.append(target)
      batch[i * num_skips + j] = buffer[skip_window]
      labels[i * num_skips + j, 0] = buffer[target]
    buffer.append(data[data_index])
    data_index = (data_index + 1) % len(data)
  return batch, labels

Это мой код для генерации обучающего набора данных, и я попытался повторить то, что написал udacity:

skip_window = 1
num_skips = 2
batch_size = 8
span = skip_window*2+1
assert num_skips <= skip_window*2

def generate_batch(batch_size,num_skips,skip_window):

    batch=[]
    label=[]
    target = skip_window

    for i in range(batch_size//num_skips):
        for j in range(num_skips):
            batch.append(data[target])
        for j in range(target-skip_window, target+skip_window+1):
            if j!= target:
                label.append([data[j]])
        target+=1

    batch=np.array(batch)
    label=np.array(label)
    return batch, label

Это начальная часть обучающего кода, когда она вызывает функцию generate_batch:

num_steps = 10001
print('valid examples: ', valid_examples)

with tf.Session(graph=graph) as session:
  tf.global_variables_initializer().run()
  print('Initialized')
  average_loss = 0
  for step in range(num_steps):
    batch_data, batch_labels = generate_batch(
      batch_size, num_skips, skip_window)
    print('batch ', step, ': ', batch_data)

Когда я запускаю тренинг с использованием кода Udacity, он генерирует разные данные для разных шагов:

batch  0 :  [   59    59   156   156   128   128   742   742   477   477 10572 10572
       134   134     1     1 27350 27350     2     2     1     1   103   103
       855   855     3     3     1     1 15068 15068     0     0     2     2
         1     1   151   151   855   855  3581  3581     1     1   195   195
        11    11   191   191    59    59     5     5     6     6 10713 10713
       215   215     7     7  1325  1325   105   105   455   455    20    20
        59    59  2732  2732   363   363     7     7  3673  3673     1     1
       709   709     2     2   372   372    27    27    41    41    37    37
        54    54   540   540    98    98    12    12     6     6  1424  1424
      2758  2758    19    19   568   568   687   687  7089  7089     1     1
       248   248  5234  5234    11    11  1053  1053]

batch  1 :  [  249   249 44612 44612  2878  2878   793   793   187   187  5234  5234
    12    12     6     6   201   201   603   603    11    11     1     1
  1135  1135    20    20  2622  2622    26    26  8984  8984     3     3
   280   280    32    32  4148  4148   142   142    60    60    26    26
  6438  6438  4187  4187     2     2   154   154    33    33   363   363
  5234  5234    37    37  1138  1138     7     7   448   448   345   345
  1819  1819    20    20  4861  4861     1     1  6754  6754     2     2
  7574  7574  1775  1775   567   567     1     1    94    94     1     1
   248   248 11065 11065    12    12    52    52  7089  7089    90    90
    27    27   271   271    38    38  5949  5949  4862  4862 20300 20300
    29    29     0     0    42    42   318   318]

Я понятия не имею, как изменить свой код, чтобы можно было генерировать разные обучающие наборы для каждого пакета, чтобы они делали то же самое, что и udacity.

Большое спасибо!

...