本文為您介紹TensorFlow的相關問題。
目錄
如何支持多Python文件引用?
您可以通過Python文件組織訓練腳本。通常首先將數據預處理邏輯存放在某個Python文件中,然后將模型定義在另一個Python文件中,最后通過一個Python文件串聯整個訓練過程。例如,在test1.py中定義函數,如果test2.py文件需要使用test1.py中的函數,且將test2.py作為程序入口文件,則只需要將test1.py和test2.py打包為.tar.gz包并上傳即可,如下圖所示。其中:
Python代碼文件:.tar.gz包。
Python主文件:入口程序文件。
如何上傳數據到OSS?
深度學習算法的數據存儲在OSS的Bucket中,因此需要先創建OSS Bucket。建議您將OSS Bucket創建在與深度學習GPU集群相同的地域,從而使用阿里云經典網絡進行數據傳輸,進而使算法運行免收流量費。創建OSS Bucket后,可以在OSS管理控制臺創建文件夾、組織數據目錄或上傳數據。
您可以通過API或SDK上傳數據至OSS,詳情請參見簡單上傳。同時,OSS提供了大量工具(工具列表請參見OSS常用工具匯總。)幫助您更高效地完成任務,建議使用ossutil或osscmd工具上傳下載文件。
使用工具上傳文件時,需要配置AccessKey ID和AccessKey Secret,您可以登錄阿里云管理控制臺創建或查看該信息。
如何讀取OSS數據?
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.gfile.Glob
、tf.gfile.FastGFile
、tf.WhoFileReader()
及tf.train.shuffer_batch()
,適用于批量讀取文件(讀取文件之前需要獲取文件列表。如果批量讀取,還需要創建Batch)。
使用Designer搭建深度學習實驗時,通常需要在界面右側設置讀取目錄及代碼文件等參數。tf.flags支持通過-XXX(XXX表示字符串)的形式傳入該參數。
import tensorflow as tf
FLAGS = tf.flags.FLAGS
tf.flags.DEFINE_string('buckets', 'oss://{OSS Bucket}/', '訓練圖片所在文件夾')
tf.flags.DEFINE_string('batch_size', '15', 'batch大小')
files = tf.gfile.Glob(os.path.join(FLAGS.buckets,'*.jpg')) # 列出buckets下所有JPG文件路徑。
批量讀取文件時,對于不同規模的文件,建議分別使用如下方式:
讀取小規模文件時,建議使用
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圖片為例。
讀取大規模文件時,建議使用
tf.WhoFileReader()
。reader = tf.WholeFileReader() # 實例化reader。 fileQueue = tf.train.string_input_producer(files) # 創建一個供reader讀取的隊列。 file_name, file_content = reader.read(fileQueue) # 使reader從隊列中讀取一個文件。 image_content = tf.image.decode_jpeg(file_content, channels=3) # 將讀取結果解碼為圖片。 label = XXX # 省略處理label的過程。 batch = tf.train.shuffle_batch([label, image_content], 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:運行線程數,一般設置為4。
capacity:隨機取文件范圍。例如,數據集有10000個數據,如果需要從5000個數據中隨機抽取,則將capacity配置為5000。
min_after_dequeue:維持隊列的最小長度,不能大于capacity。
如何為OSS寫入數據?
您可以通過以下任意一種方式將數據寫入OSS中,生成的文件存儲在輸出目錄/model/example.txt:
通過
tf.gfile.FastGFile()
寫入,示例如下。tf.gfile.FastGFile(FLAGS.checkpointDir + 'example.txt', 'wb').write('hello world')
通過
tf.gfile.Copy()
拷貝,示例如下。tf.gfile.Copy('./example.txt', FLAGS.checkpointDir + 'example.txt')
為什么運行過程中出現OOM?
使用的內存達到上限30 GB,建議通過gfile讀取OSS數據,詳情請參見如何讀取OSS數據?。
TensorFlow有哪些案例?
使用TensorFlow自動寫歌,詳情請參見TensorFlow自動寫歌詞及寫歌案例。
如何查看TensorFlow相關日志?
查看TensorFlow相關日志請參見查看訓練中的日志。
配置兩個GPU時,model_average_iter_interval有什么作用?
如果未配置model_average_iter_interval參數,則GPU會運行標準的Parallel-SGD,每個迭代都會交換梯度更新。如果model_average_iter_interval大于1,則使用Model Average方法,訓練迭代間隔若干輪(model_average_iter_interval表示數值輪數)計算兩個平均模型參數。
TensorFlow模型如何導出為SavedModel?
SavedModel格式
使用EAS預置官方Processor將TensorFlow模型部署為在線服務,必須先將模型導出為官方定義的SavedModel格式(TensorFlow官方推薦的導出模型格式)。SavedModel模型格式的目錄結構如下。
assets/
variables/
variables.data-00000-of-00001
variables.index
saved_model.pb|saved_model.pbtxt
其中:
assets
表示一個可選目錄,用于存儲預測時的輔助文檔信息。variables
存儲tf.train.Saver保存的變量信息。saved_model.pb
或saved_model.pbtxt
存儲MetaGraphDef(存儲訓練預測模型的程序邏輯)和SignatureDef(用于標記預測時的輸入和輸出)。
導出SavedModel
使用TensorFlow導出SavedModel格式的模型請參見Saving and Restoring。如果模型比較簡單,則可以使用如下方式快速導出SavedModel。
tf.saved_model.simple_save(
session,
"./savedmodel/",
inputs={"image": x}, ## x表示模型的輸入變量。
outputs={"scores": y} ## y表示模型的輸出。
)
請求在線預測服務時,請求中需要指定模型signature_name,使用simple_save()
方法導出的模型中,signature_name默認為serving_default。
如果模型比較復雜,則可以使用手工方式導出SavedModel,代碼示例如下。
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
tensor_info_x = tf.saved_model.utils.build_tensor_info(x)
tensor_info_y = tf.saved_model.utils.build_tensor_info(y)
prediction_signature = (
tf.saved_model.signature_def_utils.build_signature_def(
inputs={'images': tensor_info_x},
outputs={'scores': tensor_info_y},
method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)
)
legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op')
builder.add_meta_graph_and_variables(
sess, [tf.saved_model.tag_constants.SERVING],
signature_def_map={
'predict_images': prediction_signature,
},
legacy_init_op=legacy_init_op
)
builder.save()
print('Done exporting!')
其中:
export_path
表示導出模型的路徑。prediction_signature
表示模型為輸入和輸出構建的SignatureDef,詳情請參見SignatureDef。示例中的signature_name為predict_imagesbuilder.add_meta_graph_and_variables
方法表示導出模型的參數。
導出預測所需的模型時,必須指定導出模型的Tag為tf.saved_model.tag_constants.SERVING。
有關TensorFlow模型的更多信息,請參見TensorFlow SavedModel。
Keras模型轉換為SavedModel
使用Keras的model.save()
方法會將Keras模型導出為H5格式,需要將其轉換為SavedModel才能進行在線預測。您可以先調用load_model()
方法加載H5模型,再將其導出為SavedModel格式,代碼示例如下。
import tensorflow as tf
with tf.device("/cpu:0"):
model = tf.keras.models.load_model('./mnist.h5')
tf.saved_model.simple_save(
tf.keras.backend.get_session(),
"./h5_savedmodel/",
inputs={"image": model.input},
outputs={"scores": model.output}
)
Checkpoint轉換為Savedmodel
訓練過程中使用tf.train.Saver()
方法保存的模型格式為checkpoint,需要將其轉換為SavedModel才能進行在線預測。您可以先調用saver.restore()
方法將Checkpoint加載為tf.Session,再將其導出為SavedModel格式,代碼示例如下。
import tensorflow as tf
# variable define ...
saver = tf.train.Saver()
with tf.Session() as sess:
# Initialize v1 since the saver will not.
saver.restore(sess, "./lr_model/model.ckpt")
tensor_info_x = tf.saved_model.utils.build_tensor_info(x)
tensor_info_y = tf.saved_model.utils.build_tensor_info(y)
tf.saved_model.simple_save(
sess,
"./savedmodel/",
inputs={"image": tensor_info_x},
outputs={"scores": tensor_info_y}
)