9

Na przykład, po utworzeniu operacji, przekazaniu danych wsadowych za pośrednictwem operacji i uruchomieniu operacji, tf.train.batch automatycznie przesyła kolejne sesje danych do sesji?TensorFlow: czy tf.train.batch automatycznie ładuje następną partię, gdy partia zakończy szkolenie?

Pytam o to, ponieważ tf.train.batch ma atrybut allow_smaller_final_batch, który umożliwia ładowanie ostatniej partii jako mniejszy niż wskazany rozmiar partii. Czy to oznacza, że ​​nawet bez pętli, kolejna partia może być automatycznie podawana? Z kodów samouczka jestem raczej zdezorientowany. Kiedy ładuję pojedynczą partię, otrzymuję dosłownie pojedynczy rozmiar wsadu o kształcie [batch_size, height, width, num_channels], ale documentation mówi, że Creates batches of tensors in tensors. Ponadto, gdy przeczytałem kod samouczka w tf-slim walkthrough tutorial, gdzie jest funkcja o nazwie load_batch, zwracane są tylko 3 tensory: images, images_raw, labels. Gdzie są "partie" danych, jak wyjaśniono w dokumentacji?

Dziękuję za pomoc.

Odpowiedz

10

... czy tf.train.batch automatycznie podaje kolejną porcję danych do sesji?

Nie. Nic nie dzieje się automatycznie. Musisz ponownie zadzwonić pod numer sess.run(...), aby załadować nową partię.

Czy to oznacza, że ​​nawet bez pętli, następna partia może być automatycznie podawana?

Numer tf.train.batch(..) będzie zawsze ładował tensory batch_size. Jeśli masz na przykład 100 obrazów i batch_size=30, będziesz mieć 3 * 30 partii, ponieważ możesz wywołać sess.run(batch) trzy razy, zanim kolejka wejściowa rozpocznie się od początku (lub zatrzymać, jeśli epoch=1). Oznacza to, że tracisz próbki z treningu 100-3*30=10. Jeśli nie chcesz ich ominąć, możesz zrobić tf.train.batch(..., allow_smaller_final_batch=True), więc teraz będziesz mieć 3x 30-próbek-partii i 1x 10-próbkowa partia zanim kolejka wejściowa zostanie uruchomiona ponownie.

Pozwól mi również opracować z próbki kodu:

queue = tf.train.string_input_producer(filenames, 
     num_epochs=1) # only iterate through all samples in dataset once 

reader = tf.TFRecordReader() # or any reader you need 
_, example = reader.read(queue) 

image, label = your_conversion_fn(example) 

# batch will now load up to 100 image-label-pairs on sess.run(...) 
# most tf ops are tuned to work on batches 
# this is faster and also gives better result on e.g. gradient calculation 
batch = tf.train.batch([image, label], batch_size=100) 

with tf.Session() as sess: 
    # "boilerplate" code 
    sess.run([ 
     tf.local_variables_initializer(), 
     tf.global_variables_initializer(), 
    ]) 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(sess=sess, coord=coord) 

    try: 
     # in most cases coord.should_stop() will return True 
     # when there are no more samples to read 
     # if num_epochs=0 then it will run for ever 
     while not coord.should_stop(): 
      # will start reading, working data from input queue 
      # and "fetch" the results of the computation graph 
      # into raw_images and raw_labels 
      raw_images, raw_labels = sess.run([images, labels]) 
    finally: 
     coord.request_stop() 
     coord.join(threads) 
+0

Dziękuję za odpowiedź. Czy mogę wiedzieć, czy jest wymagana pętla for, aby kontynuować ładowanie następnej partii? Czy obecnie ładujesz 100 przykładów do jednej partii, jeśli w zbiorze danych dotyczących szkolenia znajduje się tylko 100 przykładów? Z większości implementacji widzę w TF, wydaje się, że istnieje pętla, ale moja nie ma, więc nie jestem tego pewien. Co więcej, dla kodu poniżej kodu płyty kotła użyłem zamiast tego tf-slim's slim.learning.train, który, jak sądzę, nie ma pętli z wyjątkiem liczby wykonanych kroków pociągu. – kwotsin

+0

Tak, jeśli w zbiorze danych treningowych znajduje się tylko 100 przykładów, w moim przykładzie powstałaby tylko jedna partia. Nie mogę polecić 'tf.contrib.slim', ponieważ ma tylko kilka dokumentacji i nie jest utrzymywany bardzo dobrze. Nie jest również jasne, czy w ogóle będą one kontynuować rozwój. – bodokaiser

+0

Jeśli w zestawie danych znajduje się więcej niż 100 przykładów, w jaki sposób zasugerowałbym załadowanie następnej partii? Gdybym miał po prostu ponownie wywołać tf.train.batch poprzez pętlę for, to czy wywoła te same przykłady? – kwotsin