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().
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
@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