久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

數(shù)據(jù)讀取

 LibraryPKU 2018-11-27

數(shù)據(jù)讀取

TensorFlow程序讀取數(shù)據(jù)一共有3種方法:

  • 供給數(shù)據(jù)(Feeding): 在TensorFlow程序運(yùn)行的每一步, 讓Python代碼來(lái)供給數(shù)據(jù)。
  • 從文件讀取數(shù)據(jù): 在TensorFlow圖的起始,, 讓一個(gè)輸入管線從文件中讀取數(shù)據(jù),。
  • 預(yù)加載數(shù)據(jù): 在TensorFlow圖中定義常量或變量來(lái)保存所有數(shù)據(jù)(僅適用于數(shù)據(jù)量比較小的情況)。

目錄

數(shù)據(jù)讀取

供給數(shù)據(jù)

TensorFlow的數(shù)據(jù)供給機(jī)制允許你在TensorFlow運(yùn)算圖中將數(shù)據(jù)注入到任一張量中,。因此,python運(yùn)算可以把數(shù)據(jù)直接設(shè)置到TensorFlow圖中,。

通過(guò)給run()或者eval()函數(shù)輸入feed_dict參數(shù),, 可以啟動(dòng)運(yùn)算過(guò)程。

with tf.Session():
  input = tf.placeholder(tf.float32)
  classifier = ...
  print classifier.eval(feed_dict={input: my_python_preprocessing_fn()})

雖然你可以使用常量和變量來(lái)替換任何一個(gè)張量,, 但是最好的做法應(yīng)該是使用placeholder op節(jié)點(diǎn),。設(shè)計(jì)placeholder節(jié)點(diǎn)的唯一的意圖就是為了提供數(shù)據(jù)供給(feeding)的方法。placeholder節(jié)點(diǎn)被聲明的時(shí)候是未初始化的,, 也不包含數(shù)據(jù),, 如果沒(méi)有為它供給數(shù)據(jù), 則TensorFlow運(yùn)算的時(shí)候會(huì)產(chǎn)生錯(cuò)誤,, 所以千萬(wàn)不要忘了為placeholder提供數(shù)據(jù),。

可以在tensorflow/g3doc/tutorials/mnist/fully_connected_feed.py找到使用placeholder和MNIST訓(xùn)練的例子,MNIST tutorial也講述了這一例子,。

從文件讀取數(shù)據(jù)

一共典型的文件讀取管線會(huì)包含下面這些步驟:

  1. 文件名列表
  2. 可配置的 文件名亂序(shuffling)
  3. 可配置的 最大訓(xùn)練迭代數(shù)(epoch limit)
  4. 文件名隊(duì)列
  5. 針對(duì)輸入文件格式的閱讀器
  6. 紀(jì)錄解析器
  7. 可配置的預(yù)處理器
  8. 樣本隊(duì)列

文件名, 亂序(shuffling), 和最大訓(xùn)練迭代數(shù)(epoch limits)

可以使用字符串張量(比如["file0", "file1"], [("file%d" % i) for i in range(2)],, [("file%d" % i) for i in range(2)]) 或者tf.train.match_filenames_once 函數(shù)來(lái)產(chǎn)生文件名列表。

將文件名列表交給tf.train.string_input_producer 函數(shù).string_input_producer來(lái)生成一個(gè)先入先出的隊(duì)列,, 文件閱讀器會(huì)需要它來(lái)讀取數(shù)據(jù),。

string_input_producer 提供的可配置參數(shù)來(lái)設(shè)置文件名亂序和最大的訓(xùn)練迭代數(shù), QueueRunner會(huì)為每次迭代(epoch)將所有的文件名加入文件名隊(duì)列中,, 如果shuffle=True的話,, 會(huì)對(duì)文件名進(jìn)行亂序處理。這一過(guò)程是比較均勻的,,因此它可以產(chǎn)生均衡的文件名隊(duì)列,。

這個(gè)QueueRunner的工作線程是獨(dú)立于文件閱讀器的線程, 因此亂序和將文件名推入到文件名隊(duì)列這些過(guò)程不會(huì)阻塞文件閱讀器運(yùn)行,。

文件格式

根據(jù)你的文件格式,, 選擇對(duì)應(yīng)的文件閱讀器, 然后將文件名隊(duì)列提供給閱讀器的read方法,。閱讀器的read方法會(huì)輸出一個(gè)key來(lái)表征輸入的文件和其中的紀(jì)錄(對(duì)于調(diào)試非常有用),,同時(shí)得到一個(gè)字符串標(biāo)量, 這個(gè)字符串標(biāo)量可以被一個(gè)或多個(gè)解析器,,或者轉(zhuǎn)換操作將其解碼為張量并且構(gòu)造成為樣本,。

CSV 文件

從CSV文件中讀取數(shù)據(jù), 需要使用TextLineReaderdecode_csv 操作, 如下面的例子所示:

filename_queue = tf.train.string_input_producer(["file0.csv", "file1.csv"])

reader = tf.TextLineReader()
key, value = reader.read(filename_queue)

# Default values, in case of empty columns. Also specifies the type of the
# decoded result.
record_defaults = [[1], [1], [1], [1], [1]]
col1, col2, col3, col4, col5 = tf.decode_csv(
    value, record_defaults=record_defaults)
features = tf.concat(0, [col1, col2, col3, col4])

with tf.Session() as sess:
  # Start populating the filename queue.
  coord = tf.train.Coordinator()
  threads = tf.train.start_queue_runners(coord=coord)

  for i in range(1200):
    # Retrieve a single instance:
    example, label = sess.run([features, col5])

  coord.request_stop()
  coord.join(threads)

每次read的執(zhí)行都會(huì)從文件中讀取一行內(nèi)容,, decode_csv 操作會(huì)解析這一行內(nèi)容并將其轉(zhuǎn)為張量列表,。如果輸入的參數(shù)有缺失,record_default參數(shù)可以根據(jù)張量的類型來(lái)設(shè)置默認(rèn)值,。

在調(diào)用run或者eval去執(zhí)行read之前,, 你必須調(diào)用tf.train.start_queue_runners來(lái)將文件名填充到隊(duì)列。否則read操作會(huì)被阻塞到文件名隊(duì)列中有值為止,。

固定長(zhǎng)度的記錄

從二進(jìn)制文件中讀取固定長(zhǎng)度紀(jì)錄,, 可以使用tf.FixedLengthRecordReadertf.decode_raw操作。decode_raw操作可以講一個(gè)字符串轉(zhuǎn)換為一個(gè)uint8的張量,。

舉例來(lái)說(shuō),,the CIFAR-10 dataset的文件格式定義是:每條記錄的長(zhǎng)度都是固定的,一個(gè)字節(jié)的標(biāo)簽,,后面是3072字節(jié)的圖像數(shù)據(jù),。uint8的張量的標(biāo)準(zhǔn)操作就可以從中獲取圖像片并且根據(jù)需要進(jìn)行重組。 例子代碼可以在tensorflow/models/image/cifar10/cifar10_input.py找到,,具體講述可參見(jiàn)教程.

標(biāo)準(zhǔn)TensorFlow格式

另一種保存記錄的方法可以允許你講任意的數(shù)據(jù)轉(zhuǎn)換為TensorFlow所支持的格式,, 這種方法可以使TensorFlow的數(shù)據(jù)集更容易與網(wǎng)絡(luò)應(yīng)用架構(gòu)相匹配。這種建議的方法就是使用TFRecords文件,,TFRecords文件包含了tf.train.Example 協(xié)議內(nèi)存塊(protocol buffer)(協(xié)議內(nèi)存塊包含了字段 Features),。你可以寫(xiě)一段代碼獲取你的數(shù)據(jù), 將數(shù)據(jù)填入到Example協(xié)議內(nèi)存塊(protocol buffer),,將協(xié)議內(nèi)存塊序列化為一個(gè)字符串,, 并且通過(guò)tf.python_io.TFRecordWriter class寫(xiě)入到TFRecords文件。tensorflow/g3doc/how_tos/reading_data/convert_to_records.py就是這樣的一個(gè)例子,。

從TFRecords文件中讀取數(shù)據(jù),, 可以使用tf.TFRecordReadertf.parse_single_example解析器。這個(gè)parse_single_example操作可以將Example協(xié)議內(nèi)存塊(protocol buffer)解析為張量,。 MNIST的例子就使用了convert_to_records 所構(gòu)建的數(shù)據(jù),。 請(qǐng)參看tensorflow/g3doc/how_tos/reading_data/fully_connected_reader.py, 您也可以將這個(gè)例子跟fully_connected_feed的版本加以比較。

預(yù)處理

你可以對(duì)輸入的樣本進(jìn)行任意的預(yù)處理,, 這些預(yù)處理不依賴于訓(xùn)練參數(shù),, 你可以在tensorflow/models/image/cifar10/cifar10.py找到數(shù)據(jù)歸一化, 提取隨機(jī)數(shù)據(jù)片,,增加噪聲或失真等等預(yù)處理的例子,。

批處理

在數(shù)據(jù)輸入管線的末端, 我們需要有另一個(gè)隊(duì)列來(lái)執(zhí)行輸入樣本的訓(xùn)練,,評(píng)價(jià)和推理,。因此我們使用tf.train.shuffle_batch 函數(shù)來(lái)對(duì)隊(duì)列中的樣本進(jìn)行亂序處理

示例:

def read_my_file_format(filename_queue):
  reader = tf.SomeReader()
  key, record_string = reader.read(filename_queue)
  example, label = tf.some_decoder(record_string)
  processed_example = some_processing(example)
  return processed_example, label

def input_pipeline(filenames, batch_size, num_epochs=None):
  filename_queue = tf.train.string_input_producer(
      filenames, num_epochs=num_epochs, shuffle=True)
  example, label = read_my_file_format(filename_queue)
  # min_after_dequeue defines how big a buffer we will randomly sample
  #   from -- bigger means better shuffling but slower start up and more
  #   memory used.
  # capacity must be larger than min_after_dequeue and the amount larger
  #   determines the maximum we will prefetch.  Recommendation:
  #   min_after_dequeue + (num_threads + a small safety margin) * batch_size
  min_after_dequeue = 10000
  capacity = min_after_dequeue + 3 * batch_size
  example_batch, label_batch = tf.train.shuffle_batch(
      [example, label], batch_size=batch_size, capacity=capacity,
      min_after_dequeue=min_after_dequeue)
  return example_batch, label_batch

如果你需要對(duì)不同文件中的樣子有更強(qiáng)的亂序和并行處理,,可以使用tf.train.shuffle_batch_join 函數(shù). 示例:

def read_my_file_format(filename_queue):
  # Same as above

def input_pipeline(filenames, batch_size, read_threads, num_epochs=None):
  filename_queue = tf.train.string_input_producer(
      filenames, num_epochs=num_epochs, shuffle=True)
  example_list = [read_my_file_format(filename_queue)
                  for _ in range(read_threads)]
  min_after_dequeue = 10000
  capacity = min_after_dequeue + 3 * batch_size
  example_batch, label_batch = tf.train.shuffle_batch_join(
      example_list, batch_size=batch_size, capacity=capacity,
      min_after_dequeue=min_after_dequeue)
  return example_batch, label_batch

在這個(gè)例子中, 你雖然只使用了一個(gè)文件名隊(duì)列,, 但是TensorFlow依然能保證多個(gè)文件閱讀器從同一次迭代(epoch)的不同文件中讀取數(shù)據(jù),,知道這次迭代的所有文件都被開(kāi)始讀取為止。(通常來(lái)說(shuō)一個(gè)線程來(lái)對(duì)文件名隊(duì)列進(jìn)行填充的效率是足夠的)

另一種替代方案是: 使用tf.train.shuffle_batch 函數(shù),設(shè)置num_threads的值大于1,。 這種方案可以保證同一時(shí)刻只在一個(gè)文件中進(jìn)行讀取操作(但是讀取速度依然優(yōu)于單線程),,而不是之前的同時(shí)讀取多個(gè)文件。這種方案的優(yōu)點(diǎn)是:

  • 避免了兩個(gè)不同的線程從同一個(gè)文件中讀取同一個(gè)樣本,。
  • 避免了過(guò)多的磁盤(pán)搜索操作,。

你一共需要多少個(gè)讀取線程呢? 函數(shù)tf.train.shuffle_batch*為TensorFlow圖提供了獲取文件名隊(duì)列中的元素個(gè)數(shù)之和的方法,。 如果你有足夠多的讀取線程, 文件名隊(duì)列中的元素個(gè)數(shù)之和應(yīng)該一直是一個(gè)略高于0的數(shù),。具體可以參考TensorBoard:可視化學(xué)習(xí).

創(chuàng)建線程并使用QueueRunner對(duì)象來(lái)預(yù)取

簡(jiǎn)單來(lái)說(shuō):使用上面列出的許多tf.train函數(shù)添加QueueRunner到你的數(shù)據(jù)流圖中,。在你運(yùn)行任何訓(xùn)練步驟之前,需要調(diào)用tf.train.start_queue_runners函數(shù),,否則數(shù)據(jù)流圖將一直掛起,。tf.train.start_queue_runners 這個(gè)函數(shù)將會(huì)啟動(dòng)輸入管道的線程,填充樣本到隊(duì)列中,,以便出隊(duì)操作可以從隊(duì)列中拿到樣本,。這種情況下最好配合使用一個(gè)tf.train.Coordinator,這樣可以在發(fā)生錯(cuò)誤的情況下正確地關(guān)閉這些線程,。如果你對(duì)訓(xùn)練迭代數(shù)做了限制,,那么需要使用一個(gè)訓(xùn)練迭代數(shù)計(jì)數(shù)器,并且需要被初始化,。推薦的代碼模板如下:

# Create the graph, etc.
init_op = tf.initialize_all_variables()

# Create a session for running operations in the Graph.
sess = tf.Session()

# Initialize the variables (like the epoch counter).
sess.run(init_op)

# Start input enqueue threads.
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)

try:
    while not coord.should_stop():
        # Run training steps or whatever
        sess.run(train_op)

except tf.errors.OutOfRangeError:
    print 'Done training -- epoch limit reached'
finally:
    # When done, ask the threads to stop.
    coord.request_stop()

# Wait for threads to finish.
coord.join(threads)
sess.close()

疑問(wèn): 這是怎么回事?

首先,,我們先創(chuàng)建數(shù)據(jù)流圖,這個(gè)數(shù)據(jù)流圖由一些流水線的階段組成,,階段間用隊(duì)列連接在一起,。第一階段將生成文件名,我們讀取這些文件名并且把他們排到文件名隊(duì)列中,。第二階段從文件中讀取數(shù)據(jù)(使用Reader),,產(chǎn)生樣本,而且把樣本放在一個(gè)樣本隊(duì)列中,。根據(jù)你的設(shè)置,,實(shí)際上也可以拷貝第二階段的樣本,使得他們相互獨(dú)立,,這樣就可以從多個(gè)文件中并行讀取,。在第二階段的最后是一個(gè)排隊(duì)操作,,就是入隊(duì)到隊(duì)列中去,在下一階段出隊(duì),。因?yàn)槲覀兪且_(kāi)始運(yùn)行這些入隊(duì)操作的線程,,所以我們的訓(xùn)練循環(huán)會(huì)使得樣本隊(duì)列中的樣本不斷地出隊(duì)。

tf.train中要?jiǎng)?chuàng)建這些隊(duì)列和執(zhí)行入隊(duì)操作,,就要添加tf.train.QueueRunner到一個(gè)使用tf.train.add_queue_runner函數(shù)的數(shù)據(jù)流圖中,。每個(gè)QueueRunner負(fù)責(zé)一個(gè)階段,處理那些需要在線程中運(yùn)行的入隊(duì)操作的列表,。一旦數(shù)據(jù)流圖構(gòu)造成功,,tf.train.start_queue_runners函數(shù)就會(huì)要求數(shù)據(jù)流圖中每個(gè)QueueRunner去開(kāi)始它的線程運(yùn)行入隊(duì)操作。

如果一切順利的話,,你現(xiàn)在可以執(zhí)行你的訓(xùn)練步驟,,同時(shí)隊(duì)列也會(huì)被后臺(tái)線程來(lái)填充。如果您設(shè)置了最大訓(xùn)練迭代數(shù),,在某些時(shí)候,,樣本出隊(duì)的操作可能會(huì)得到一個(gè)tf.OutOfRangeError的錯(cuò)誤。這其實(shí)是TensorFlow的“文件結(jié)束”(EOF) ———— 這就意味著已經(jīng)達(dá)到了最大訓(xùn)練迭代數(shù),,已經(jīng)沒(méi)有更多可用的樣本了,。

最后一個(gè)因素是Coordinator。這是負(fù)責(zé)在收到任何關(guān)閉信號(hào)的時(shí)候,,讓所有的線程都知道,。最常用的是在發(fā)生異常時(shí)這種情況就會(huì)呈現(xiàn)出來(lái),比如說(shuō)其中一個(gè)線程在運(yùn)行某些操作時(shí)出現(xiàn)錯(cuò)誤(或一個(gè)普通的Python異常),。

想要了解更多的關(guān)于threading, queues, QueueRunners, and Coordinators的內(nèi)容可以看這里.

疑問(wèn): 在達(dá)到最大訓(xùn)練迭代數(shù)的時(shí)候如何清理關(guān)閉線程?

想象一下,,你有一個(gè)模型并且設(shè)置了最大訓(xùn)練迭代數(shù)。這意味著,,生成文件的那個(gè)線程將只會(huì)在產(chǎn)生OutOfRange錯(cuò)誤之前運(yùn)行許多次,。該QueueRunner會(huì)捕獲該錯(cuò)誤,并且關(guān)閉文件名的隊(duì)列,,最后退出線程,。關(guān)閉隊(duì)列做了兩件事情:

  • 如果還試著對(duì)文件名隊(duì)列執(zhí)行入隊(duì)操作時(shí)將發(fā)生錯(cuò)誤。任何線程不應(yīng)該嘗試去這樣做,,但是當(dāng)隊(duì)列因?yàn)槠渌e(cuò)誤而關(guān)閉時(shí),,這就會(huì)有用了。
  • 任何當(dāng)前或?qū)?lái)出隊(duì)操作要么成功(如果隊(duì)列中還有足夠的元素)或立即失?。òl(fā)生OutOfRange錯(cuò)誤),。它們不會(huì)防止等待更多的元素被添加到隊(duì)列中,因?yàn)樯厦娴囊稽c(diǎn)已經(jīng)保證了這種情況不會(huì)發(fā)生,。

關(guān)鍵是,,當(dāng)在文件名隊(duì)列被關(guān)閉時(shí)候,,有可能還有許多文件名在該隊(duì)列中,這樣下一階段的流水線(包括reader和其它預(yù)處理)還可以繼續(xù)運(yùn)行一段時(shí)間,。 一旦文件名隊(duì)列空了之后,,如果后面的流水線還要嘗試從文件名隊(duì)列中取出一個(gè)文件名(例如,從一個(gè)已經(jīng)處理完文件的reader中),,這將會(huì)觸發(fā)OutOfRange錯(cuò)誤,。在這種情況下,即使你可能有一個(gè)QueueRunner關(guān)聯(lián)著多個(gè)線程,。如果這不是在QueueRunner中的最后那個(gè)線程,,OutOfRange錯(cuò)誤僅僅只會(huì)使得一個(gè)線程退出。這使得其他那些正處理自己的最后一個(gè)文件的線程繼續(xù)運(yùn)行,,直至他們完成為止,。 (但如果假設(shè)你使用的是tf.train.Coordinator,其他類型的錯(cuò)誤將導(dǎo)致所有線程停止),。一旦所有的reader線程觸發(fā)OutOfRange錯(cuò)誤,,然后才是下一個(gè)隊(duì)列,再是樣本隊(duì)列被關(guān)閉,。

同樣,,樣本隊(duì)列中會(huì)有一些已經(jīng)入隊(duì)的元素,,所以樣本訓(xùn)練將一直持續(xù)直到樣本隊(duì)列中再?zèng)]有樣本為止,。如果樣本隊(duì)列是一個(gè)RandomShuffleQueue,因?yàn)槟闶褂昧?code>shuffle_batch 或者 shuffle_batch_join,,所以通常不會(huì)出現(xiàn)以往那種隊(duì)列中的元素會(huì)比min_after_dequeue 定義的更少的情況,。 然而,一旦該隊(duì)列被關(guān)閉,,min_after_dequeue設(shè)置的限定值將失效,,最終隊(duì)列將為空。在這一點(diǎn)來(lái)說(shuō),,當(dāng)實(shí)際訓(xùn)練線程嘗試從樣本隊(duì)列中取出數(shù)據(jù)時(shí),,將會(huì)觸發(fā)OutOfRange錯(cuò)誤,然后訓(xùn)練線程會(huì)退出,。一旦所有的培訓(xùn)線程完成,,tf.train.Coordinator.join會(huì)返回,你就可以正常退出了,。

篩選記錄或產(chǎn)生每個(gè)記錄的多個(gè)樣本

舉個(gè)例子,,有形式為[x, y, z]的樣本,我們可以生成一批形式為[batch, x, y, z]的樣本,。 如果你想濾除這個(gè)記錄(或許不需要這樣的設(shè)置),,那么可以設(shè)置batch的大小為0,;但如果你需要每個(gè)記錄產(chǎn)生多個(gè)樣本,那么batch的值可以大于1,。 然后很簡(jiǎn)單,,只需調(diào)用批處理函數(shù)(比如: shuffle_batch or shuffle_batch_join)去設(shè)置enqueue_many=True就可以實(shí)現(xiàn)。

稀疏輸入數(shù)據(jù)

SparseTensors這種數(shù)據(jù)類型使用隊(duì)列來(lái)處理不是太好,。如果要使用SparseTensors你就必須在批處理之后使用tf.parse_example 去解析字符串記錄 (而不是在批處理之前使用 tf.parse_single_example) ,。

預(yù)取數(shù)據(jù)

這僅用于可以完全加載到存儲(chǔ)器中的小的數(shù)據(jù)集。有兩種方法:

  • 存儲(chǔ)在常數(shù)中,。
  • 存儲(chǔ)在變量中,,初始化后,永遠(yuǎn)不要改變它的值,。

使用常數(shù)更簡(jiǎn)單一些,,但是會(huì)使用更多的內(nèi)存(因?yàn)槌?shù)會(huì)內(nèi)聯(lián)的存儲(chǔ)在數(shù)據(jù)流圖數(shù)據(jù)結(jié)構(gòu)中,這個(gè)結(jié)構(gòu)體可能會(huì)被復(fù)制幾次),。

training_data = ...
training_labels = ...
with tf.Session():
  input_data = tf.constant(training_data)
  input_labels = tf.constant(training_labels)
  ...

要改為使用變量的方式,,您就需要在數(shù)據(jù)流圖建立后初始化這個(gè)變量。

training_data = ...
training_labels = ...
with tf.Session() as sess:
  data_initializer = tf.placeholder(dtype=training_data.dtype,
                                    shape=training_data.shape)
  label_initializer = tf.placeholder(dtype=training_labels.dtype,
                                     shape=training_labels.shape)
  input_data = tf.Variable(data_initalizer, trainable=False, collections=[])
  input_labels = tf.Variable(label_initalizer, trainable=False, collections=[])
  ...
  sess.run(input_data.initializer,
           feed_dict={data_initializer: training_data})
  sess.run(input_labels.initializer,
           feed_dict={label_initializer: training_lables})

設(shè)定trainable=False 可以防止該變量被數(shù)據(jù)流圖的 GraphKeys.TRAINABLE_VARIABLES 收集, 這樣我們就不會(huì)在訓(xùn)練的時(shí)候嘗試更新它的值,; 設(shè)定 collections=[] 可以防止GraphKeys.VARIABLES 收集后做為保存和恢復(fù)的中斷點(diǎn),。

無(wú)論哪種方式,tf.train.slice_input_producer function函數(shù)可以被用來(lái)每次產(chǎn)生一個(gè)切片,。這樣就會(huì)讓樣本在整個(gè)迭代中被打亂,,所以在使用批處理的時(shí)候不需要再次打亂樣本。所以我們不使用shuffle_batch函數(shù),,取而代之的是純tf.train.batch 函數(shù),。 如果要使用多個(gè)線程進(jìn)行預(yù)處理,需要將num_threads參數(shù)設(shè)置為大于1的數(shù)字,。

tensorflow/g3doc/how_tos/reading_data/fully_connected_preloaded.py 中可以找到一個(gè)MNIST例子,,使用常數(shù)來(lái)預(yù)加載。 另外使用變量來(lái)預(yù)加載的例子在tensorflow/g3doc/how_tos/reading_data/fully_connected_preloaded_var.py,,你可以用上面 fully_connected_feedfully_connected_reader 的描述來(lái)進(jìn)行比較,。

多輸入管道

通常你會(huì)在一個(gè)數(shù)據(jù)集上面訓(xùn)練,然后在另外一個(gè)數(shù)據(jù)集上做評(píng)估計(jì)算(或稱為 "eval"),。 這樣做的一種方法是,,實(shí)際上包含兩個(gè)獨(dú)立的進(jìn)程:

  • 訓(xùn)練過(guò)程中讀取輸入數(shù)據(jù),并定期將所有的訓(xùn)練的變量寫(xiě)入還原點(diǎn)文件),。
  • 在計(jì)算過(guò)程中恢復(fù)還原點(diǎn)文件到一個(gè)推理模型中,,讀取有效的輸入數(shù)據(jù)。

這兩個(gè)進(jìn)程在下面的例子中已經(jīng)完成了:the example CIFAR-10 model,,有以下幾個(gè)好處:

  • eval被當(dāng)做訓(xùn)練后變量的一個(gè)簡(jiǎn)單映射,。
  • 你甚至可以在訓(xùn)練完成和退出后執(zhí)行eval,。

您可以在同一個(gè)進(jìn)程的相同的數(shù)據(jù)流圖中有訓(xùn)練和eval,并分享他們的訓(xùn)練后的變量,。參考the shared variables tutorial.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多