2016-06-27 2 views
2

Я реализую регрессионную сеть, отображающую изображения в позы, используя API Tensorflow/python и пытаюсь обработать вывод FixedLengthRecordReader.slicing Tensorflow FixedLengthRecordReader value

Я пытаюсь адаптировать cifar10 example минимально для моих целей.

Пример cifar10 считывает необработанные байты, декодирует, а затем разбивает.

result.key, value = reader.read(filename_queue) 

# Convert from a string to a vector of uint8 that is record_bytes long. 
record_bytes = tf.decode_raw(value, tf.uint8) 

# The first bytes represent the label, which we convert from uint8->int32. 
result.label = tf.cast(
    tf.slice(record_bytes, [0], [label_bytes]), tf.int32) 

# The remaining bytes after the label represent the image, which we reshape 
# from [depth * height * width] to [depth, height, width]. 
depth_major = tf.reshape(tf.slice(record_bytes, [label_bytes], [image_bytes]), 
         [result.depth, result.height, result.width]) 
# Convert from [depth, height, width] to [height, width, depth]. 
result.uint8image = tf.transpose(depth_major, [1, 2, 0]) 

Читаю из списка двоичных файлов с данными, сохраненными в виде (pose_data, image_data). Поскольку мои данные по положению - float32, а мои данные изображения - uint8, я хочу сначала нарезать, а затем наложить. К сожалению, результат value reader.read - это нулевой размерный тензор, поэтому нарезка не работает.

key, value = reader.read(filename_queue) 
print value.dtype 
print value.get_shape() 

<dtype: 'string'> 
() 

В результате tf.decode_raw (значение, DTYPE) представляет собой 1-мерный массив, но требует, чтобы DTYPE быть указан, и tf.string не является допустимым типом, который он принимает.

Можно ли разрезать перед декодированием? Или мне нужно декодировать -> case back to string -> slice -> recast? Есть ли другой способ?

ответ

0

cifar10 пример упомянутой ФП, а также решение с декодированием дважды не работает, когда данные имеют несколько типов (вопрос OP), и не «выстраивается» (более общий случай).

Если данные, например:

[float32][int16][int16] 

дважды декодирования работ. Однако если это ваши данные:

[int16][float32][int16] 

он не работает, как tf.decode_raw не принимает смещение половины float32.

Что действительно работает в этом случае tf.substr(), возвращаемое значение

result.key, value = reader.read(filename_queue) 

фактически строка (или байтовой строки, если хотите), и пусть себе раскол.

-1

Нашли решение: дважды декодировали и выбрасывали половину. Не так эффективно (и если у кого-то есть лучшее решение, я был бы рад услышать это), но он, похоже, работает.

key, value = reader.read(filename_queue) 
uint8_bytes = tf.decode_raw(value, tf.uint8) 
uint8_data = uint8_bytes[:n_uint8_vals] 
float32_bytes = tf.decode_raw(value, tf.float32) 
float32_start_index = n_uint8_vals // 4 
float32_data = float32_bytes[float32_start_index:] 

Это требует n_uint8_vals быть фактором 4.

+0

ссылка сломана, я хотел бы увидеть пример, если можно вставить здесь. – Bastiaan