web-dev-qa-db-ja.com

TensorFlow:バッチのトレーニングが終了すると、tf.train.batchは次のバッチを自動的にロードしますか?

たとえば、操作を作成し、操作を介してバッチデータをフィードし、操作を実行した後、tf.train.batchは別のデータバッチをセッションに自動的にフィードしますか?

これは、tf.train.batchの属性がallow_smaller_final_batchこれにより、指定されたバッチサイズよりも小さいサイズで最終バッチをロードできます。これは、ループがなくても、次のバッチが自動的に供給されることを意味しますか?チュートリアルコードから私はかなり混乱しています。単一のバッチを読み込むと、文字通り形状の単一のバッチサイズ[batch_size、height、width、num_channels]を取得しますが、 documentationCreates batches of tensors in tensors.また、load_batchと呼ばれる関数がある tf-slimウォークスルーチュートリアル のチュートリアルコードを読むと、3つのテンソルしか返されません:images, images_raw, labels。ドキュメントで説明されているデータの「バッチ」はどこにありますか?

ご協力ありがとうございました。

17
kwotsin

... tf.train.batchは別のデータバッチをセッションに自動的にフィードしますか?

いいえ。自動的には何も起こりません。新しいバッチをロードするには、sess.run(...)を再度呼び出す必要があります。

これは、ループがなくても、次のバッチが自動的に供給されることを意味しますか?

いいえ。tf.train.batch(..)は常に_batch_size_テンソルをロードします。たとえば、100個の画像と_batch_size=30_がある場合、入力キューが最初から開始する前にsess.run(batch)を3回呼び出すことができるように、3 * 30バッチがあります(または_Epoch=1_)。これは、トレーニングから_100-3*30=10_サンプルを見逃すことを意味します。見逃したくない場合は、tf.train.batch(..., allow_smaller_final_batch=True)を実行できます。入力キューが再起動する前に、3個の30サンプルバッチと1個の10サンプルバッチができます。

コードサンプルも詳しく説明します。

_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)
_
18
bodokaiser

次のバッチをロードするたびに、sess.runを呼び出してバッチを渡す必要があります。以下のコードを参照してください。

img = [0,1,2,3,4,5,6,7,8]
lbl = [0,1,2,3,4,5,6,7,8]
images = tf.convert_to_tensor(img)
labels = tf.convert_to_tensor(lbl)
input_queue = tf.train.slice_input_producer([images,labels])
sliced_img = input_queue[0]
sliced_lbl = input_queue[1]

img_batch, lbl_batch = tf.train.batch([sliced_img,sliced_lbl], batch_size=3)
with tf.Session() as sess:
    coord   = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)

    for i in range(0,3): #batch size
        image_batch,label_batch = sess.run([img_batch,lbl_batch ])
        print(image_batch, label_batch)

    coord.request_stop()
    coord.join(threads)

答えは次のようになります。

[4,1,8] [4,1,8]

[2,3,7] [2,3,7]

[2,6,8] [2,6,8]

0
Abdul Bari