Я записал изображение, метку и имя файла в файл tfrecords. Когда я пытаюсь декодировать файл, я не могу преобразовать имя файла в строку из tf.string.
Код, который я написал для преобразования его в файл tfrecords:
num_batches = 6
batch_size = math.ceil(X_training.shape[0] / num_batches)
for i in range(num_batches):
train_path = os.path.join("data","batch_" + str(i) + '.tfrecords')
writer = tf.python_io.TFRecordWriter(train_path)
start_row = i * batch_size
end_row = start_row + batch_size - 1
for idx in range(start_row, end_row):
try:
label = y_tr[idx]
filename = train_filenames[idx].tostring()
image = X_tr[idx]
image_raw = image.tostring()
except:
continue
example = tf.train.Example(
features=tf.train.Features(
feature = {
'label': _int64_feature(label),
'filename': _bytes_feature(filename),
'image': _bytes_feature(image_raw),
}))
serialized = example.SerializeToString()
writer.write(serialized)
Для чтения и декодирования файла tfrecords у меня есть функция:
def read_and_decode_single_example(filenames):
filename_queue = tf.train.string_input_producer(filenames)
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
features = tf.parse_single_example(
serialized_example,
features = {
'label': tf.FixedLenFeature([], tf.int64),
'filename': tf.FixedLenFeature([], tf.string),
'image': tf.FixedLenFeature([], tf.string)
})
label = features['label']
image = tf.decode_raw(features['image'], tf.uint8)
image = tf.reshape(image, [499, 499, 1])
filename = features['filename']
return label, image, filename
Когда я декодирую разные пакеты, возвращаемое имя файла выглядит так:
b'P\x00\x00\x00_\x00\x00\x000\x00\x00\x000\x00\x00\x001\x00\x00\x004\x00\x00\x008\x00\x00\x00_\x00\x00\x00R\x00\x00\x00I\x00\x00\x00G\x00\x00\x00H\x00\x00\x00T\x00\x00\x00_\x00\x00\x00M\x00\x00\x00L\x00\x00\x00O\x00\x00\x00.\x00\x00\x00j\x00\x00\x00p\x00\x00\x00g\x00\x00\x00'
Что я делаю неправильно при декодировании из tf.string?
Да, в самом деле! Это именно то имя файла, которое я искал.






Вызов .decode().replace('\x00', '') в вашей строке байтов производит «P_00148_RIGHT_MLO.jpg».
Добавление декодирования и замены в возвращаемой функции должно решить вашу проблему.
Вызов
.decode().replace('\x00', '')в вашей строке байтов производит «P_00148_RIGHT_MLO.jpg». Это что-то похожее на желаемое имя файла?