У меня есть набор данных последовательностей переменной длины (набор данных 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