顯示具有 Tensorflow 標籤的文章。 顯示所有文章
顯示具有 Tensorflow 標籤的文章。 顯示所有文章

2017年3月25日 星期六

[Tensorflow] 將圖片轉成 TFRecords 檔案

如何將影像訓練資料轉成 Tensorflow可以讀的 TFrecords 檔?

嘗試可行方案

透過 build_image_data.py 轉成 TFrecords 檔

For inception-v3 model

1. 方案1

在Tensorflow官方的Github上

How to Construct a New Dataset for Retraining

Briefly, this script takes a structured directory of images and converts it to a sharded TFRecord that can be read by the Inception model.
教我們如何產生 Inception model 可以讀的 TFrecords 格式

如果有安裝Bazel這個Google內部使用的 make file 工具的話

按照裡面的指令,就能夠將影像資料轉成 tfrecords 檔

步驟1: 先準備好 訓練資料的資料夾 & 驗證資料的資料夾 
以及負責標籤的 labels.txt 檔( txt 檔裡面只有資料夾名稱,一個資料夾一行,其餘用換行鍵隔開)

步驟2: 

bazel-bin/inception/build_image_data \                      # 照著輸入即可
--train_directory="${TRAIN_DIR}" \                      # 輸入訓練資料夾位置
--validation_directory="${VALIDATION_DIR}" \    # 輸入驗證資料夾位置
--output_directory="${OUTPUT_DIRECTORY}" \  # 輸出 tfrecords 檔的路徑
--labels_file="${LABELS_FILE}" \                        #裡面只有資料夾名稱,即有哪些資料夾需要處理 
--train_shards=128 \                                               # 照著輸入即可
--validation_shards=24 \                                         # 照著輸入即可
--num_threads=8                                                   # 照著輸入即可


2. 方案2

註:與 How to Retrain a Trained Model on the Flowers Data(較小資料量的訓練 (218 MB)) 類似的內容

For pre-trained model

之前利用NVIDIA官網上的教學


則是可以產生 已經訓練過的模型 (內有ckpt檔案的路徑,執行後會自動網路上下載)可以讀的 TFrecords 格式

因為不想要改動原本裡面內建的腳本程式,所以另外複製了一份

並且更改檔案名稱

需要小心的是,如果今天創造了一個新的程式

需要在 inception/data 裡面有一個檔案叫作 BUILD 的txt檔案裡面加上它需要的資訊

最簡單的作法是找到原本檔案的資訊,名稱以及對應的檔案改成新的檔案名就可以了


---(暫不採用)寫一個腳本程式(script ) ---

腳本程式(負責準備好訓練用影像資料夾等路徑) + python 檔案(實際處理)

原因:因為需要考慮bazel這個建置程式可能造成的影響(ex. 只能在特定資料夾下處理)

所以直接拿Tensorflow models資料夾中的腳本直接來修改比較省時間
-------------------------------------------------------------------------------------------
背景知識補充 : 認識與學習BASH、學習 Shell Scripts

參考以下的文章

How do I create a script file for terminal commands?

以 vim 打開一個程式任意的撰寫畫面

請務必確保在第一行寫下以下的程式

#!/bin/bash

接著,再將該程式標示為可執行

chmod +x 檔案名稱

What does set -e mean in a bash script?

What does -z mean in Bash?


Bazel

使用bazel build之前

記得開一個worksapce,這邊的通關密碼是輸入

touch WORKSPACE

相關 bazel 建置的問題 : The 'build' command is only supported from within a workspace 

後來去查 Bazel 的官方使用教學的 Using a Workspace 這段也有提到這件事情





待嘗試...

教學文 Tfrecords Guide :執行 python code 產生 tfrecords 檔  

Python 

新創一個 python 檔案

在命令列視窗裡面以vim開啟一個結尾是.py的檔案

$ vim filename.py

進入vim編輯的畫面之後

記得在第一行加上下列的程式碼

#!/usr/bin/python

按下 [Esc] 鍵之後,輸入冒號符號: 和英文字母 wq,代表寫入(Write)並離開(Quit)的意思


2017年3月23日 星期四

[Tensorflow] 以 Tensorlfow 內建的 Timeline 函數來作為 profiling 工具

最近對手邊沒有一個比較好的 Tensorflow profiling工具感到發愁的時候

在網路上搜尋資訊的時候剛好看到下面這篇 stackoverflow 的文章

Can I measure the execution time of individual operations with TensorFlow?

裡面就提到了 Tensorflow 裡面內建的 Timeline 這個函數



另外,Github 上面的也有類似的疑問

Profiling tools for open source TensorFlow #1824

其中,prb12 也提到 Timeline 這個函數,並提供了簡單的文字教學 :

I'm unlikely to have much time to write a tutorial in the near future, but the current status of the open source tools are as follows: 
There is now a basic CUPTI GPU tracer integrated in the runtime. You can run a step with tracing enabled and it records both the ops which are executed and the GPU kernels which are launched. Here is an example:
run_metadata = tf.RunMetadata()
_, l, lr, predictions = sess.run(
            [optimizer, loss, learning_rate, train_prediction],
            feed_dict=feed_dict,
            options=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE),
            run_metadata=run_metadata)
After the step completes, the run_metadata should contain a StepStats protobuf with lots of timing information, grouped by tensorflow device. The CUPTI GPU tracing appears as some additional devices with names like /gpu:0/stream:56 and /gpu:0/memcpy 
Note: to get GPU tracing you will need to ensure that libcupti.so is on you LD_LIBRARY_PATH. It is usually found in /usr/local/cuda/extras/lib64.
The simplest way to use this information is to load the stats into a 'Timeline' as follows:
from tensorflow.python.client import timeline
trace = timeline.Timeline(step_stats=run_metadata.step_stats)
The Timeline class can then be used to emit a JSON trace file in the Chrome Tracing Format, as follows:
trace_file = open('timeline.ctf.json', 'w')
trace_file.write(trace.generate_chrome_trace_format())
To view this trace, navigate to the URL 'chrome://tracing' in a Chrome web browser, click the 'Load' button and locate the timeline file.
It would be fairly simple to write a small python web server which served up these traces from a running TensorFlow program like this


打開 Chrome,並在網址尋列輸入:Chrome://tracing 就有簡單的 gui 能夠使用

按下Load,選取剛創造的json檔案,就能夠將前一個時刻創造的 Timeline 圖表給呈現出來

2017年2月21日 星期二

[Tensorflow] 以Intel Vtune amplifier 對 Tensorflow 分散式學習 Profiling

硬體配置 - 4台PC  負責運算的worker 上面各有2張 NVIDIA 的 GTX 1080

我以負責其中一台 node0 當作 parameter server

Analysis Target

Application : /usr/bin/python  #填入執行 python 的 binary 所在位置

Application parameters : /home/paslab/workspace/benchmark/tensorflow/exercise-01/example.py python example.py --job_name="ps" --task_index=0  #這邊相當於填入command line裡面的內容,我們在這邊輸入要profile程式的位置,接下來在輸入執行 python 訓練程式所在的位置

Working Directory : 選擇你要把分析完的結果存放在那理

Analysis Type

選擇自己需要的分析方式


以上都填寫正確並選擇完畢之後

按下 start 之後,如果一切正確,就可以看到分散式訓練順利的開始執行,如下圖一所示


圖一、VTune 成功執行分散式運算

表示 VTune 開始執行該支程式並開始 Profiling

[Tensorflow] [Linux] 執行分散式學習常見問題

Q1 : 在Linux環境底下,Parameter Server 該如何關閉 ?


A1 : 有個方法,先按下  [Ctrl] + [Z] 將該程式丟到背景並暫停

並在 cmd window 裡面下

pkill python

pkill 指令與 killall 指令類似,也是可以指定程式名稱,但是其所指定的名稱會直接以常規表示法(regular expression)的方式比對,只要比對成功,就會中止該程式。 對於不熟悉常規表示法的初學者而言,用此程式可能比較危險,如果使用不正確的常規表示法,可能會把不該中止的程式也砍了,所以使用上要注意。 --- 在 Linux 中使用 kill、killall 與 xkill 等指令強迫關閉程式

接下來再輸入

fg

fg 是將背景工作移動到前景,目的是確認該支程式已經被關閉 (Terminated)





Q2 :  明明檢查了cmd輸入的指令,還有不同台負責作工作分配的Parameter Server、算權重的Worker 它們運行的程式,為什麼不能執行?


A2 : 有個問題可能是之前執行的 python 程式並未正確關閉沒有結束,因此在GPU當中依舊存在殭屍程序。如果GPU的廠牌是 Nvidia,這個時候可以透過以下的指令

nvidia-smi

檢查 GPU 裡面運行的Process有那些,再利用以下的指令把它關閉

kill -9 process / kill -9 PID

kill -9 process 這個指令可以在沒有 admin 權限下把我自己帳號產生的 python 程序強制關閉,這邊要注意我所說的強制的意思,就是在這樣的關閉情況底下,程式所產生的暫存檔會消失。所以使用上需要特別注意,除非 -15 沒辦法正常關閉,不然不要隨意使用。

-9  :代表立刻強制刪除一個工作

-15:以正常的程序方式結束一件工作,與 -9 關閉的方式不同(類似直接關閉電腦的電源或是長按電腦的電源鍵 vs 正常程序關機)
不過,畢竟正常的作法中,你應該先使用 fg 來取回前景控制權,然後再離開 vim 才對~因此,以上面的範例二為例,其實 kill 確實無法使用 -15 正常的結束掉 vim 的動作喔!此時還是不建議使用 -9 啦!因為你知道如何正常結束該程序不是嗎? 通常使用 -9 是因為某些程式你真的不知道怎麼透過正常手段去終止他,這才用到 -9 的! ---  第十六章、程序管理與 SELinux 初探 - 管理背景當中的工作: kill

在 Linux 當中,常常遇到下的指令不符合權限這個問題,因此需要特別注意

由前面一連幾個章節的資料看來,我們一直強調在 Linux 底下所有的指令與你能夠進行的動作都與權限有關, 而系統如何判定你的權限呢?當然就是第十三章帳號管理當中提到的 UID/GID 的相關概念,以及檔案的屬性相關性囉!再進一步來解釋,你現在大概知道,在 Linux 系統當中:『觸發任何一個事件時,系統都會將他定義成為一個程序,並且給予這個程序一個 ID ,稱為 PID,同時依據啟發這個程序的使用者與相關屬性關係,給予這個 PID 一組有效的權限設定。』 從此以後,這個 PID 能夠在系統上面進行的動作,就與這個 PID 的權限有關了!---  第十六章、程序管理與 SELinux 初探
第十六章 程序管理與 SELinux 初探 這個是基礎知識補充,有需要再查詢即可

2017年2月11日 星期六

[Tensorflow] 權重更新機制 Parameter Server (參數服務器) 介紹

由於神經網路大小與訓練資料數量越來越龐大

所以分散式訓練已經成為機器學習的趨勢

其中 Tensorflow 的參數更新的方式是使用 parameter server 來作為權重更新的機制


不同框架的比較

以下是在知乎上很完整的介紹

最近比较火的parameter server是什么?

論文 Parameter Server for Distributed Machine Learning

論文作者本人李沐的介紹頁面


動畫解釋

另一篇【深度学习&分布式】Parameter Server 详解


看完這兩篇

對於參數服務器會有更深入的認識

2017年1月13日 星期五

[Tensorflow] 什麼是 Placeholder ?

之前有點不太清楚 Placeholder 到底在做什麼

下面是我查到的結果,詳細的可以

A placeholder is simply a variable that we will assign data to at a later date --- Placeholders - Learning Tensorflow.com

簡單來講就是一個之後可以儲存值的變數 (想像一下 向量 或是 Tensor )

x = tf.placeholder("float", 3)

First, we import tensorflow as normal. Then we create a placeholder called x, i.e. a place in memory where we will store value later on. The 3 on this line denotes that we will store three values in this placeholder.

所以,等等 x 可以被儲存3個浮點數進去

當然,也可以不指定 x 的儲存數量,例如以下

x = tf.placeholder("float", None)

2017年1月5日 星期四

[Tensorflow] 安裝 Tensorflow r 0.12 + CUDA 8.0 + cudnn v 5.1

[前情提要]

重新安裝回去 Tensorflow  r 0.12 + CUDA 8.0 + CuDNN v 5.1 是因為遇到了下面的問題

原本的環境是 Tensorflow r 0.10 + CUDA 7.5(最穩定) + CuDNN v 5.1.3 + Ubuntu 16.04 LTS

執行 NVIDIA 官網上面訓練Google inception v3 的影像分類器之後得到以下的相同問題
(NVIDIA- SPEED UP TRAINING WITH GPU-ACCELERATED TENSORFLOW)


發現上面遇到的問題必須使用較新的Tensorflow r 0.11 版本

運行之後,發現貌似 r 0.11 只支援 CUDA 8.0
# Ubuntu/Linux 64-bit, GPU enabled, Python 2.7 # Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Install from sources" below. 
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.11.0-cp27-none-linux_x86_64.whl

---- 官方 r 0.11 的安裝


後來查證了 wiki 上 CUDA 的條目資訊

發現 CUDA 8.0 是能夠支援我現在所使用的GPU ( NVIDIA GeForce GTX 660 )

因此,為了執行後續其他的專案

保險起見,我還是先把 Tensorflow  r 0.12 + CUDA 8.0 + CuDNN v5 安裝起來

[前置作業]
解除安裝

解除安裝舊的 Tensorflow、CUDA toolkit、CuDNN

可以參考這篇 Removing nvidia cuda toolkit and installing new one

移除資料夾的方法可以參考這篇 rm – 刪除檔案及目錄指令
(特別注意:使用 rm 的時候請注意刪除的是什麼)

安裝

CUDA toolkit 8.0

先下載下來 CUDA toolkit 8.0

載完之後會有教使用者如何安裝的指令

Installation Instructions:
Run `sudo sh cuda_8.0.44_linux.run`
Follow the command-line prompts

CuDNN v5

一樣也是下載下來,再將 CuDNN 中的資料拷貝到 CUDA 的路徑中

sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

環境變數設定
按照以下的文字輸入進 .bashrc 檔(依據自己安裝的路徑進行調整)

export CUDA_HOME=/usr/local/cuda-8.0

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64:/usr/local/cuda/extras/CUPTI/lib64"

PATH="/usr/local/cuda-8.0/bin:$PATH";export PATH

設定完之後,請在 bash shell 中鍵入

source .bashrc

讓bashrc中的路徑設定進行更新

[配置]
進入tensorflow所在的資料夾,執行configure檔,例如以下的範例

$ ./configurePlease specify the location of python. [Default is /usr/bin/python]:

Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] N No Google Cloud Platform support will be enabled for TensorFlow

Do you wish to build TensorFlow with GPU support? [y/N] y GPU support will be enabled for TensorFlow Please specify which gcc nvcc should use as the host compiler. [Default is /usr/bin/gcc]:

Please specify the Cuda SDK version you want to use, e.g. 7.0. [Leave empty to use system default]: 8.0

Please specify the location where CUDA 8.0 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:

Please specify the cuDNN version you want to use. [Leave empty to use system default]: 5

Please specify the location where cuDNN 5 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:

Please specify a list of comma-separated Cuda compute capabilities you want to build with. You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus. Please note that each additional compute capability significantly increases your build time and binary size. [Default is: "3.5,5.2"]: 3.0

Setting up Cuda includeSetting up Cuda libSetting up Cuda binSetting up Cuda nvvmSetting up CUPTI includeSetting up CUPTI lib64Configuration finished

[常見錯誤]

心理準備

基本上安裝的時候會出現很多問題,Google 是你/妳最忠實的朋友,有問題就問它!


路徑位置

圖片檔經過轉換之後的TFRecord file 還有 訓練模型的 路徑位置請務必確認


GPU 記憶體大小

由於 GPU 內部的記憶體大小有限,所以一次處理過多的圖片會有記憶體爆炸的問題

所以可以先從較低的 batch_size 往上調,目前手邊的機器使用的是NVIDIA GTX 660

內部記憶體只有2G,我就遇到 ResourceExhaustError 這個錯誤,後來就從 batch_size  = 1開始往上調



2016年12月28日 星期三

[Tensorflow] GPU版本安裝硬體需求

[ 這篇文是寫給GPU版本的使用者,CPU版本的使用者可以忽略 ]

NVIDIA 官網上面提供的 GPU版本 TensorFlow 安裝教學文件

提醒各位,如果是在 Linux 環境底下,務必事先確保正在安裝的版本是可以支援的

不然會面臨 重新解除安裝,再重新安裝 的窘境

對於 Linux 新手來說,如果沒有具備經驗的人從旁指導,所消耗的時間是巨大的...

以下是相關安裝所需要具備的條件

The GPU-enabled version of TensorFlow has the following requirements:
  • 64-bit Linux
  • Python 2.7
  • NVIDIA CUDA® 7.5 (CUDA 8.0 required for Pascal GPUs)
  • NVIDIA cuDNN v4.0 (minimum) or v5.1 (recommended)

You will also need an NVIDIA GPU supporting compute capability 3.0 or higher.
- See more at: http://www.nvidia.com/object/gpu-accelerated-applications-tensorflow-installation.html#sthash.TfIK4hr5.dpuf

 別忘了,要使用支援運算能力達到 3.0 以上的 GPU 卡

還有下載下來的 Tensorflow 版本需要能支援以上條件 NVIDIA 驅動程式以及開發套件

2016年12月23日 星期五

[Tensorfow] 簡易影像分類器 訓練教學 - TensorFlow For Poets

TensorFlow For Poets 是一篇訓練分類兩種不同種花的教學文

按照步驟輸入指令,就能夠順利安裝 Docker

接著再按照步驟一步一步的訓練完分類器之後

在Docker的環境裡面執行以下的指令

python /tf_files/label_images.py /tf_files/flower_photos/花的資料夾/某張花的影像檔名.副檔名

cmd就會把兩個分類結果選項以及分數給秀出來,就如同下面這樣

daisy (score = 0.99936)
roses (score = 0.00064)

從分數的高低,可以知道我剛剛用來測試的影像是 Daisy(雛菊)


2016年11月24日 星期四

[Tensorflow] 資料可視化 - Tensorboard

一直被 Tensorboard 沒辦法顯示 graph 這件事情困擾

TensorFlow 官網也沒有一步步的圖文教學

後來在 youtube 上面找到對岸網友 周莫煩 的TensorFlow 資料可視化教學視頻

Tensorflow 14 Visualization Tensorboard 1 (neural network tutorials)

利用周莫煩提供的程式碼

加上下面這個視頻

TensorFlow Tutorial in Chinese 10:TensorBoard 可视化计算图谱

點選上排的Graph

就能夠顯示基本的神經網絡資料圖表了




我發現上禮拜一直沒有辦法顯示 DataFlow Graph 的原因了

其實很簡單

在前面的 Tensorflow 14 Visualization Tensorboard 1 (neural network tutorials) 這段影片中

10:41 也有提到這件事情

執行完程式之後

writer = tf.train.SummaryWriter("logs/", sess.graph) 這行程式碼會創造出一個 logs 資料夾

同時內含有 Tensorboard 所需要的資訊

如果終端機現在進入 logs 檔,並在終端機中輸入

tensorboard  --logdir="logs"

它已經在 logs 資料夾中,以至於讀不到logs資料夾中產生的紀錄檔

因此,回到資料夾的上一層

重新輸入

tensorboard  --logdir="logs"
它會給我們一個 https 的位址,將它輸入瀏覽器中,就能夠進入 Tensorboard 中

點選上排的 Graph 按鍵,即可得到 DataFlow Graph

/* 載入prettify的autoloader */ /* 載入JQuery */