2018年8月28日 星期二

Windows 安裝 dlib

Windows 安裝 dlib


Dlib 是甚麼?

BJ4,不然你會甚麼來這裡?  :)

安裝 Dlib : A Hard Way


理論上安裝  dlib  就是

pip install dlib

但是,在 Windows 上你應該會看到這個訊息:


我想,在 windows 上看到這個 cmake XXX 的錯誤,應該是人生裡面幾件最令人厭煩的事情之一,在前一台筆電上,這件事花了小弟不少青春跟電費,你要下載一大包東西、等待、龐雜的錯誤訊息 ....

安裝 Dlib : 有甚麼比站在巨人的肩膀上更爽快?

這個頁面應該會救了你  : https://pypi.org/simple/dlib/



好處不及遍數:

  1. 都好了,下載而已
  2. pypi 官方認證,比較安全,下載一些木馬回來也不見得比較輕鬆
  3. 省下很多時間喝茶打屁看FB
趕快動手作:

  1. 抓回來放在目錄裡 (我是下載 dlib-19.8.1-cp36-cp36m-win_amd64.whl)
  2. pip install dlib-19.8.1-cp36-cp36m-win_amd64.whl
  3. 搞定
  4. 玩耍去 ...

2018年8月11日 星期六

Tensorflow 的卷積層 tf.nn.conv2d() 用法

Tensorflow 的 tf.nn.conv2d() 用法


參數

tf.nn.conv2d( input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

Input 輸入資料(如一張圖片)

Input 的型態被設定為一個 4D 的 tensor,這四個維度設定跟 data_format 這個參數有關,
如果 data_format 設成 "NHWC"(預設值), 則四個維度的順序為:

[ Batch size(有多少張圖),  Height(圖高幾個像素), Width(圖寬幾個像素), Channels (有幾個頻道 如 R-G-B 就為 3 個, 單色圖片就為 1) ]

若設成 "NCHW" ,就變成
[ Batch size, Channels, Height, Width ]

# tensor 宣告可以像這樣 
x = tf.placeholder(tf.float32, shape=[1, 5, 5, 1])

輸入的資料可以像這樣

import numpy as np 
import tensorflow as tf 

x_in = np.array([
     [
         [[2], [1], [2], [0], [1]],
         [[1], [3], [2], [2], [3]],
         [[1], [1], [3], [3], [0]],
         [[2], [2], [0], [1], [1]],
         [[0], [0], [3], [1], [2]],
     ]
])

print(x_in.shape) # 形狀就是(1, 5, 5, 1)


Filter 過濾器 (有時稱 kernel )

圖一:Convolution 卷積示意

過濾器的本質就如圖示,I 是輸入的圖片,K即是過濾器。
過濾器之格式為:

[ Height (過濾器高) x Width (過濾器寬) x Input Channels (輸入幾個 channels - 是被 input 所決定的) x Output Channels (輸出幾個 channels - 如圖是 1) ]

特別說明一下,input channel 是被上一層的 channels 數所決定的,而 output channel 則是看下一層接住這個 convolution layer 的 input 會有多少。有興趣更深入的,這裡有進一步講解。

Strides 步進

進行 convolution 計算時,一步要前進多少。由於有四個面向 (即 data_format 所定義的 (NHWC 或 NCHW),所以這個值是一個 1D 的 tensor,但是有四個值,就照 data_format 所定義的順序,一次要跳多少。最常用的就是直接定義為 [1, 1, 1, 1]。

Padding 填充

選擇有兩種,'SAME' or 'VALID',這兩種演算法有人用底下這個圖,我覺得最容易一目了然。以一個例子來說:

  • Input width = 13
  • Filter width = 6
  • Stride = 5 


VALID就是當 filter 不斷滑過去計算,剩下的就丟掉 (drop)。SAME就是過程中不足的,自動補 0 進去。 更簡單來說,如果就整個 input 寬度的邊界來說,會跨過去的(當然要補值)就是 SAME,不會跨過去的就是 VALID。

Data_format 資料格式

前面一直在介紹的,有兩種資料排列方式,NHWC 與 NCHW,預設是 NHWC。
N : 圖形批次 batch size
H : 圖形高度 image height
W: 圖形寬度 image width
C: 頻道數,前面解釋過,RGB圖為三個、單色圖為一個,如果非圖形則看自己要連結的下一層輸入數

Use_cudnn_on_gpu GPU加速

是一個布林值 ( True 或 False ),是否要使用 Nvidia 的類神經網路庫 cudnn 來作 GPU 加速。

範例

import numpy as np 
import tensorflow as tf 

x_in = np.array([
     [ 
         [[1], [2], [3], [4], [5]], 
         [[5], [4], [3], [2], [1]], 
         [[1], [3], [5], [7], [9]], 
         [[2], [4], [6], [8], [10]], 
         [[1], [0], [1], [0], [1]], 
     ] 
]) 

# 設 out_channels==1 
kernel = np.array([ 
     [ 
         [[1]],[[2]] ], [ [[3]],[[4]] 
     ],
])

x = tf.placeholder(tf.float32, shape=[1, 5, 5, 1])
k = tf.constant(kernel, dtype=tf.float32)
conv = tf.nn.conv2d(x, k, strides=[1, 1, 1, 1], padding='VALID')

with tf.Session() as sess:
     result = sess.run(conv, feed_dict={x: x_in})
     print(result.shape, result)


參考

喜歡 "原廠" 英文函數說明的參考這裡