Padded_batch с опцией до или после заполнения - PullRequest
0 голосов
/ 23 октября 2019

У меня есть набор данных последовательностей переменной длины (набор данных TFRecord tenorsflow) для подачи в сеть LSTM, и я хочу попробовать сравнить предварительное и последующее заполнение в пакетах, но текущая функция padded_batch только дополняет в конце последовательностей,Я знаю, что у нас есть функция tf.keras.preprocessing.sequence.pad_sequences в API, но я не знаю, как применить эту функцию к пакетному процессору набора данных. Функция padded_batch в тензорном потоке выполняет как заполнение, так и пакетирование, и динамически находит необходимый размер заполнения для пакета. Как я могу реализовать это сам? Мой код сейчас такой, и я читаю несколько файлов TFRecord и чередую их, чтобы создать мой смешанный набор данных:

featuresDict = {'data': tf.FixedLenFeature([], dtype=tf.string),
                'rows': tf.FixedLenFeature([], dtype=tf.int64),
                'label': tf.FixedLenFeature([], dtype=tf.int64)
               }

def parse_tfrecord(example):
    features = tf.parse_single_example(example, featuresDict)
    label = tf.one_hot(features['label'],N)
    rows = features['rows']
    data = tf.decode_raw(features['data'], tf.int64)
    data = tf.reshape(data, (rows,num_features)
    return data, label

def read_datasets(pattern, numFiles, numEpochs=None, batchSize=None):
    files = tf.data.Dataset.list_files(pattern)

    def _parse(x):
        x = tf.data.TFRecordDataset(x, compression_type='GZIP')
        return x

    dataset = files.interleave(_parse, cycle_length=numFiles, block_length=1).map(parse_tfrecord)
    padded_shapes = (tf.TensorShape([None, num_features]), tf.TensorShape([N,])))
    dataset = dataset.padded_batch(batchSize, padded_shapes)
    dataset = dataset.prefetch(buffer_size=batchSize)
    dataset = dataset.repeat(numEpochs)
    return dataset
...