tensorflow 檔案管理

2021-08-17 22:08:33 字數 3242 閱讀 7254

目錄

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()  # 例項化乙個reader

filequeue = 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...