Я новичок в машинном обучении и пытаюсь понять курс 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.
Большое спасибо!