2016-02-25 8 views
7
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 

Używam TFRecord do przechowywania wszystkich moich danych. Funkcja read_and_decode pochodzi z przykładu TFRecords dostarczonego przez TensorFlow. Obecnie zmieniam kształt o wstępnie zdefiniowane wartości:Jak używać wartości odczytywanych z TFRecords jako argumentów dla tf.reshape?

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

Jednak dane, które będę teraz używać, mają różne wymiary. Na przykład mogę mieć obraz, który jest [40, 30, 3] (skalowanie to nie jest opcja, ponieważ nie chcę, aby był wypaczony). Chciałbym przeczytać w danych o różnych wymiarach i użyć random_crop w etapie augmentacji danych, aby obejść ten problem. Potrzebuję czegoś takiego jak poniżej.

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

Jednak nie mogę znaleźć sposobu na zrobienie tego. Dzięki za pomoc!

EDIT:

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]) 

Problemem jest na pewno z tych 2 linii. Ciężko kodowane zmienne działają, ale nie te z tf.pack().

+0

Re: edycja. Wygląda na to, że używasz jednego z opów obrazu, który wymaga poznania wszystkich kształtów w czasie budowy wykresu (takich jak przycinanie lub pad). Wydaje się to jednak niezwiązane z pierwotnym pytaniem (dotyczącym czytania rzeczy z TFRecords), więc powinieneś zadać nowe pytanie, jak sobie z tym poradzić. Pamiętaj, aby dołączyć pełny ślad stosu wraz z komunikatem o błędzie! – mrry

+0

@mrry, masz rację, że to tf.random_crop powoduje ten problem. Zgodnie z Twoją sugestią zadałem nowe pytanie na stronie: http://stackoverflow.com/questions/35691102/valueerror-all-shapes-must-be-fully-defined-issue-due-to-commenting-out-tf -biegł. – jkschin

Odpowiedz

3

Jesteś bardzo blisko do działającego rozwiązania! W tej chwili nie ma sposobu, aby dać TensorFlow listę składającą się z tensorów i liczb i wytworzyć z niej tensor, którego oczekuje się od. Odpowiedź brzmi: użyj tf.stack(), która jawnie pobiera listę N-wymiarowych tensorów (lub rzeczy przekształcalnych na tensory) i pakuje je w tensor o wymiarach (N + 1).

Oznacza to, że można napisać:

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])) 
+0

Dzięki za poprawkę. Na początku działało. Ale teraz dostaję ten błąd. Zobacz szczegóły w celu edycji. – jkschin

+0

Mam również ten sam problem, ponieważ tf.pack jest usuwany, a tf.stack jest zastępowany, użyłem tf.stack, Ale po twardym wymiarze sznurowania wszystko działało. Czy to jest oczekiwane zachowanie Tensorflowa – GPrathap

+0

Znalazłem, jak działa po przeczytaniu odpowiedzi tutaj [https: // github.com/tensorflow/tensorflow/issues/2604], Dzięki – GPrathap

1

Mam w obliczu tego samego problemu. Zgodnie z Tensorflow documentation napotkasz tę sytuację, jeśli próbujesz użyć operacji shuffle_batch po odczytaniu wymaganych danych.

Podobnie jak w tym przykładzie, jeśli nie używasz przetwarzania shuffle_batch, możesz załadować dynamiczne pliki wymiarowe.

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) 

Ale jeśli jesteś w użyciu przetwarzania wsadowego Shuffle, nie można używać tf.stack. Musisz zdefiniować wymiary statycznie podobne do tego.

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 proszę mnie poprawić, jeśli się mylę.

Powiązane problemy