Вы можете достичь этого, используя tf.train.SequenceExample.Я отредактировал ваш код, чтобы он возвращал как 1D, так и 2D данные.Сначала вы создаете список функций, которые вы помещаете в tf.train.FeatureList.Мы преобразуем наши 2D-данные в байты.
vals = [5, 5]
vals_2d = [np.zeros((5,5), dtype=np.uint8), np.ones((5,5), dtype=np.uint8)]
features = [tf.train.Feature(int64_list=tf.train.Int64List(value=[val])) for val in vals]
features_2d = [tf.train.Feature(bytes_list=tf.train.BytesList(value=[val.tostring()])) for val in vals_2d]
featureList = tf.train.FeatureList(feature=features)
featureList_2d = tf.train.FeatureList(feature=features_2d)
Чтобы получить правильную форму нашей 2D-функции, нам нужно предоставить контекст (непоследовательные данные), это делается с помощью контекстного словаря.
context_dict = {'height': tf.train.Feature(int64_list=tf.train.Int64List(value=[vals_2d[0].shape[0]])),
'width': tf.train.Feature(int64_list=tf.train.Int64List(value=[vals_2d[0].shape[1]])),
'length': tf.train.Feature(int64_list=tf.train.Int64List(value=[len(vals_2d)]))}
Затем вы помещаете каждый FeatureList в словарь tf.train.FeatureLists.Наконец, это помещается в tf.train.SequenceExample вместе с контекстным словарем
my_example = tf.train.SequenceExample(feature_lists=tf.train.FeatureLists(feature_list={'1D':featureList,
'2D': featureList_2d}),
context = tf.train.Features(feature=context_dict))
my_example_str = my_example.SerializeToString()
with tf.python_io.TFRecordWriter('my_example.tfrecords') as writer:
writer.write(my_example_str)
Чтобы прочитать его обратно в тензорный поток, вам нужно использовать tf.FixedLenSequenceFeature для последовательных данных и tf.FixedLenFeature для контекстаданные.Мы преобразуем байты обратно в целые числа и анализируем данные контекста, чтобы восстановить правильную форму.
# Reading it back via a Dataset
featuresDict = {'1D': tf.FixedLenSequenceFeature([], dtype=tf.int64),
'2D': tf.FixedLenSequenceFeature([], dtype=tf.string)}
contextDict = {'height': tf.FixedLenFeature([], dtype=tf.int64),
'width': tf.FixedLenFeature([], dtype=tf.int64),
'length':tf.FixedLenFeature([], dtype=tf.int64)}
def parse_tfrecord(example):
context, features = tf.parse_single_sequence_example(example, sequence_features=featuresDict, context_features=contextDict)
height = context['height']
width = context['width']
seq_length = context['length']
vals = features['1D']
vals_2d = tf.decode_raw(features['2D'], tf.uint8)
vals_2d = tf.reshape(vals_2d, [seq_length, height, width])
return vals, vals_2d
Dataset = tf.data.TFRecordDataset('my_example.tfrecords')
Dataset = Dataset.map(parse_tfrecord)
iterator = Dataset.make_one_shot_iterator()
with tf.Session() as sess:
print(sess.run(iterator.get_next()))
Это выведет последовательность [5, 5] и двумерные массивы.В этом посте более подробно рассматривается определение последовательностей с помощью tfrecords https://dmolony3.github.io/Working%20with%20image%20sequences.html