目錄
1. 如何pai上讀取資料
2.如何減少讀取的費用開支
3. 使用oss需要注意的問題
1. 在pai上讀取資料
python不支援讀取oss的資料, 故所有呼叫 python open(), os.path.exist() 等檔案, 資料夾操作的函式的**都無法執行.
如scipy.misc.imread(), numpy.load() 等
那如何在pai讀取資料呢, 通常我們採用兩種辦法.
如果只是簡單的讀取一張, 或者乙個文字等, 可以使用tf.gfile下的函式, 具體成員函式如下
tf.gfile.copy(oldpath, newpath, overwrite=false) # 拷貝檔案具體的文件可以參照這裡(可能需要翻牆)tf.gfile.deleterecursively(dirname) # 遞迴刪除目錄下所有檔案
tf.gfile.exists(filename) # 檔案是否存在
tf.gfile.fastgfile(name, mode='r') # 無阻塞讀寫檔案
tf.gfile.gfile(name, mode='r') # 讀寫檔案
tf.gfile.glob(filename) # 列出資料夾下所有檔案, 支援pattern
tf.gfile.isdirectory(dirname) # 返回dirname是否為乙個目錄
tf.gfile.listdirectory(dirname) # 列出dirname下所有檔案
tf.gfile.makedirs(dirname) # 在dirname下建立乙個資料夾, 如果父目錄不存在, 會自動建立父目錄. 如果
資料夾已經存在, 且資料夾可寫, 會返回成功
tf.gfile.mkdir(dirname) # 在dirname處建立乙個資料夾
tf.gfile.remove(filename) # 刪除filename
tf.gfile.rename(oldname, newname, overwrite=false) # 重新命名
tf.gfile.stat(dirname) # 返回目錄的統計資料
tf.gfile.walk(top, inorder=true) # 返回目錄的檔案樹
如果是一批一批的讀取檔案, 一般會採用tf.whofilereader() 和 tf.train.batch() / tf.train.shuffer_batch()
接下來會重點介紹常用的tf.gfile.glob, tf.gfile.fastgfile,tf.whofilereader() 和tf.train.shuffer_batch()
讀取檔案一般有兩步
1. 獲取檔案列表
2. 讀取檔案
如果是批量讀取, 還有第三步
3. 建立batch
從**上手: 在使用pai的時候, 通常需要在右側設定讀取目錄, **檔案等引數, 這些引數都會通過--***的形式傳入
tf.flags可以提供了這個功能
import tensorflow as tf接下來就分兩種情況了import os
flags = tf.flags.flags
# 前面的buckets, checkpointdir都是固定的, 不建議更改
tf.flags.define_string('buckets', 'oss://***', '訓練所在資料夾')
tf.flags.define_string('batch_size', '15', 'batch大小')
# 獲取檔案列表
files = tf.gfile.glob(os.path.join(flags.buckets,'*.jpg')) # 如我想列出buckets下所有jpg檔案路徑
1. (小規模讀取時建議) tf.gfile.fastgfile()
for path in files:file_content = tf.gfile.fastgfile(path, 'rb').read() # 一定記得使用rb讀取, 不然很多情況下都會報錯
image = tf.image.decode_jpeg(file_content, channels=3
) # 本教程以jpg為例
2. (大批量讀取時建議) tf.whofilereader()
reader = tf.wholefilereader() # 例項化乙個readerfilequeue = tf.train.string_input_producer(files) # 建立乙個供reader讀取的佇列
file_name, file_content = reader.read(filequeue) # 使reader從佇列中讀取乙個檔案
image = tf.image.decode_jpeg(file_content, channels=3) # 講讀取結果解碼為
label = *** # 這裡省略處理label的過程
batch = tf.train.shuffle_batch([label, image], batch_size=flags.batch_size, num_threads=4,
capacity=1000 + 3 * flags.batch_size, min_after_dequeue=1000)
sess = tf.session() # 建立session
tf.train.start_queue_runners(sess=sess) # 重要!!! 這個函式是啟動佇列, 不加這句執行緒會一直阻塞
labels, images = sess.run(batch) # 獲取結果
解釋下其中重要的部分
tf.train.string_input_producer
, 這個是把files轉換成乙個佇列, 並且需要 tf.train.start_queue_runners 來啟動佇列
tf.train.shuffle_batch
引數解釋
batch_size
批大小, 每次執行這個batch, 返回多少個資料
num_threads
執行執行緒數, 在pai上4個就好
capacity
隨機取檔案範圍, 比如你的資料集有10000個資料, 你想從5000個資料中隨機取, capacity就設定成5000.
min_after_dequeue
維持佇列的最小長度, 這裡只要注意不要大於capacity即可
tensorflow視訊記憶體管理
在執行上面的blog的tensorflow小程式的時候程式我們會遇到乙個問題,當然這個問題不影響我們實際的結果計算,但是會給同樣使用這台計算機的人帶來麻煩,程式會自動呼叫所有能呼叫到的資源,並且全占滿,在自己的pc上沒問題,但是在伺服器上,問題就很大,因為一旦你執行程式,佔滿視訊記憶體別人就不能再用...
Tensorflow檔案讀取
tensorflow讀取檔案的特點 讀取檔案資料量特別大 需要在樣本集中隨機讀取n個樣本,每批次讀取的物件不一樣 隨機,分批次 需要讀取的快 使用tensorflow的執行緒,不使用python的執行緒 全域性直譯器鎖 tensorflow檔案讀取的步驟 將要讀取的檔案放入檔名佇列中 因為用執行緒來...
TensorFlow變數管理詳解
一 tensorflow變數管理 1.tensorflow還提供了tf.get variable函式來建立或者獲取變數,tf.variable用於建立變數時,其功能和tf.variable基本是等價的。tf.get variable中的初始化方法 initializer 的引數和tf.variabl...