Возможно ли зацикливание, когда размер тензора неизвестен? - PullRequest
0 голосов
/ 23 октября 2018

Я хотел бы прочитать последовательность временных рядов, сохраненную в формате tfrecord.Каждый временной ряд имеет разную длину.Чего я хочу добиться, так это разбить длинный тензор на партии меньших тензоров требуемой длины.Это очень легко сделать с массивами numpy, и это будет выглядеть так:

length = 200
for begin in range(tensor_size-length):
     tensor_slice = tf.slice(my_tensor, begin, length)
     my_slices.append(tensor_slice)

В такой функции моя проблема заключается в следующем: как получить размер тензора, чтобы можно было использовать цикл?Ниже приведена часть кода, где пример читается и декодируется.

file_queue = tf.train.string_input_producer(tf_files, num_epochs=num_epochs)
        reader = tf.TFRecordReader()
        _, serialized_records = reader.read(file_queue)

        feature_map = {
            "speed":tf.FixedLenSequenceFeature([], tf.float32, allow_missing=True),
            "battery":tf.FixedLenSequenceFeature([], tf.float32, allow_missing=True)
        }

        features = tf.parse_single_example(serialized_records, feature_map)
        speed = tf.cast(features['speed'], tf.float32)
        battery = tf.cast(features['battery'], tf.float32)
        speeds = []
        batteries = []

        #SPLIT TENSOR INTO SMALLER TENSORS
        features = tf.train.shuffle_batch([speeds, batteries],
                                           batch_size=batch_size,
                                           capacity=5000,
                                           num_threads=4,
                                           min_after_dequeue=1)

        return features

1 Ответ

0 голосов
/ 23 октября 2018

Вы не можете перебрать такой тензор в Python.Вы можете использовать tf.while_loop, хотя этого обычно избегают, если только это не единственный способ достичь того, чего вы хотите, поскольку он имеет тенденцию быть медленным.В вашем случае вы можете получить нужный результат без зацикливания, например, используя tf.gather:

length = 200
features = ...
# Number of elements
n = tf.shape(features)[0]
# Index from zero to number of subtensors
split_idx = tf.range(n - length + 1)
# Index from zero to subtensor length
length_idx = tf.range(length)
# Indices for gather; each row advances one position, like a "rolling window"
gather_idx = split_idx[:, tf.newaxis] + length_idx
# Gather result
features_split = tf.gather(features, gather_idx)
...