¿Cómo puedo usar los valores leídos de TFRecords como argumentos para tf.reshape?

def read_and_decode(filename_queue): reader = tf.TFRecordReader() _, serialized_example = reader.read(filename_queue) features = tf.parse_single_example( serialized_example, # Defaults are not specified since both keys are required. features={ 'image_raw': tf.FixedLenFeature([], tf.string), 'label': tf.FixedLenFeature([], tf.int64), 'height': tf.FixedLenFeature([], tf.int64), 'width': tf.FixedLenFeature([], tf.int64), 'depth': tf.FixedLenFeature([], tf.int64) }) # height = tf.cast(features['height'],tf.int32) image = tf.decode_raw(features['image_raw'], tf.uint8) image = tf.reshape(image,[32, 32, 3]) image = tf.cast(image,tf.float32) label = tf.cast(features['label'], tf.int32) return image, label 

Estoy usando un TFRecord para almacenar todos mis datos. La función read_and_decode es del ejemplo de TFRecords proporcionado por TensorFlow. Actualmente remodelar teniendo valores predefinidos:

 image = tf.reshape(image,[32, 32, 3]) 

Sin embargo, los datos que usaré ahora son de diferentes dimensiones. Por ejemplo, podría tener una imagen que sea [40, 30, 3] (escalar esto no es una opción ya que no quiero que esté deformada). Me gustaría leer datos de diferentes dimensiones y usar random_crop en la etapa de aumento de datos para evitar este problema. Lo que necesito es algo como lo siguiente.

 height = tf.cast(features['height'], tf.int32) width = tf.cast(features['width'], tf.int32) image = tf.reshape(image,[height, width, 3]) 

Sin embargo, parece que no puedo encontrar una manera de hacer esto. ¡Gracias por tu ayuda!

EDITAR:

 ValueError: All shapes must be fully defined: [TensorShape([Dimension(None), Dimension(None), Dimension(None)]), TensorShape([])] image = tf.reshape(image, tf.pack([height, width, 3])) image = tf.reshape(image, [32,32,3]) 

El problema es definitivamente con estas 2 líneas. Las variables de código duro funcionan, pero no la de tf.pack ().

Estás muy cerca de tener una solución de trabajo! En este momento no hay una forma automática de darle a TensorFlow una lista compuesta de tensores y números y hacer un tensor a partir de ella, que tf.reshape() está esperando. La respuesta es usar tf.stack() , que toma explícitamente una lista de tensores N-dimensionales (o cosas convertibles en tensores) y los empaqueta en un tensor dimensional (N + 1).

Esto significa que puedes escribir:

 features = ... # Parse from an example proto. height = tf.cast(features['height'], tf.int32) width = tf.cast(features['width'], tf.int32) image = tf.reshape(image, tf.stack([height, width, 3])) 

He enfrentado el mismo problema. De acuerdo con la documentación de Tensorflow , se encontrará con esta situación si está tratando de usar la operación shuffle_batch después de leer los datos requeridos.

Como en este ejemplo, si no utiliza el procesamiento shuffle_batch, puede cargar archivos dynamics tridimensionales.

  reader = tf.TFRecordReader() _, serialized_example = reader.read(filename_queue) features = tf.parse_single_example( serialized_example, features={ 'clip_height': tf.FixedLenFeature([], tf.int64), 'clip_width': tf.FixedLenFeature([], tf.int64), 'clip_raw': tf.FixedLenFeature([], tf.string), 'clip_label_raw': tf.FixedLenFeature([], tf.int64) }) image = tf.decode_raw(features['clip_raw'], tf.float64) label = tf.cast(features['clip_label_raw'], tf.int32) height = tf.cast(features['clip_height'], tf.int32) width = tf.cast(features['clip_width'], tf.int32) im_shape = tf.stack([height, width, -1]) new_image = tf.reshape(image, im_shape ) 

Pero si va a utilizar el procesamiento por lotes aleatorio, no puede usar tf.stack . Tienes que definir dimensiones estáticamente similares a esta.

  reader = tf.TFRecordReader() _, serialized_example = reader.read(filename_queue) features = tf.parse_single_example( serialized_example, features={ 'clip_height': tf.FixedLenFeature([], tf.int64), 'clip_width': tf.FixedLenFeature([], tf.int64), 'clip_raw': tf.FixedLenFeature([], tf.string), 'clip_label_raw': tf.FixedLenFeature([], tf.int64) }) image = tf.decode_raw(features['clip_raw'], tf.float64) label = tf.cast(features['clip_label_raw'], tf.int32) height = tf.cast(features['clip_height'], tf.int32) width = tf.cast(features['clip_width'], tf.int32) image = tf.reshape(image, [1, 512, 1]) images, sparse_labels = tf.train.shuffle_batch( [image, label], batch_size=batch_size, num_threads=2, capacity=1000 + 3 * batch_size, min_after_dequeue=100) 

@mrry por favor corrígeme si estoy equivocado.