Я пишу конвейер данных для подачи пакетов последовательностей временных рядов и соответствующих меток в модель LSTM, для которой требуется трехмерная входная форма. В настоящее время у меня есть следующее:
def split(window):
return window[:-label_length], window[-label_length]
dataset = tf.data.Dataset.from_tensor_slices(data.sin)
dataset = dataset.window(input_length + label_length, shift=label_shift, stride=1, drop_remainder=True)
dataset = dataset.flat_map(lambda window: window.batch(input_length + label_length))
dataset = dataset.map(split, num_parallel_calls=tf.data.AUTOTUNE)
dataset = dataset.cache()
dataset = dataset.shuffle(shuffle_buffer, seed=shuffle_seed, reshuffle_each_iteration=False)
dataset = dataset.batch(batch_size=batch_size, drop_remainder=True)
dataset = dataset.prefetch(tf.data.AUTOTUNE)
В результате получается форма for x, y in dataset.take(1): x.shape (32, 20), где 32 - размер пакета, а 20 - длина последовательности, но мне нужна форма (32, 20, 1), где дополнительный размер обозначает функцию.
Мой вопрос в том, как я могу изменить форму, в идеале в функции split, которая передается в функцию dataset.map перед кэшированием данных?






Это просто. Сделайте это в своей функции разделения
def split(window):
return window[:-label_length, tf.newaxis], window[-label_length, tf.newaxis, tf.newaxis]
Это будет return window[:-label_length, tf.newaxis], window[-label_length, tf.newaxis, tf.newaxis]?
Я только что протестировал, работает, спасибо большое
Эй, да, извини, я не знал, что тебе нужны цели, чтобы иметь дополнительное измерение. И да, все, что вам нужно сделать, это добавить tf.newaxis к этикеткам. Я обновлю свой ответ
Это возвращает правильную форму для данных x (32,20,1), но не для целей. Ожидаемая форма - (32, 1, 1), но она возвращает форму (32,)