Тензорный поток непрерывный текст от последовательности к последовательности. Почему партия?
Я работаю над созданием предсказателя Шекспира от последовательности к последовательности и смотрю на пример кода, который, кажется, выполняет группировку в группах по 50 символов. Я немного смущен этим. Если текст непрерывный, и вы обрабатываете куски по 50 символов, то это, безусловно, означает, что вы когда-либо рассчитываете потери только на основе следующего ожидаемого символа после 50-го символа, и модель никогда не обучается следующим ожидаемым символам для остальные 49 символов. Другими словами, если у вас есть 1000 символов с 20 наборами по 50 символов, учат предсказывать только 20 различных символов. Разве эти партии не должны смещаться на случайное смещение в каждую эпоху, чтобы он научился предсказывать других персонажей?
Это не может быть правдой, конечно? Что мне здесь не хватает в моем понимании?
Кроме того, всегда ли партии обрабатываются последовательно? Когда состояние переносится для представления предыдущих последовательностей, это, безусловно, важно.
Спасибо Рэй
Обновление 7/24: вот оригинальный код...
self.num_batches = int(self.tensor.size / (self.batch_size *
self.seq_length))
# When the data (tensor) is too small,
# let's give them a better error message
if self.num_batches == 0:
assert False, "Not enough data. Make seq_length and batch_size small."
self.tensor = self.tensor[:self.num_batches * self.batch_size * self.seq_length]
xdata = self.tensor
ydata = np.copy(self.tensor)
ydata[:-1] = xdata[1:]
ydata[-1] = xdata[0]
self.x_batches = np.split(xdata.reshape(self.batch_size, -1),
self.num_batches, 1)
self.y_batches = np.split(ydata.reshape(self.batch_size, -1),
self.num_batches, 1)
Насколько я вижу, это не похоже на совпадение, но я новичок в Python, поэтому, может быть, чего-то не хватает.
1 ответ
Если у вас есть 1000 chars
и если вы создадите 20 sets
из 50 chars
, это становится неперекрывающимся окном, и, как вы сказали, оно не будет работать. Вместо этого вы рассматриваете перекрывающееся окно путем сдвига на один символ и создаете (1000-50) sets
данных обучения. Это правильный способ сделать это.