前言
猶記得一週前,對圖形驗證碼有點想法,自信滿滿的去做破解的工作,但是實際被各種打臉,不接觸這行,真不懂裡面的套路;
開篇
當今在網際網路混,不隨口說出深度學習,人工智慧,機器學習,神經網路等詞,人家都懷疑是個假的網際網路人了,但不知道是否有同學跟JB一樣,傻傻分不清?
本來是不太想沾這趟水的,畢竟知道自己不是那個料,但是最近被驗證碼折騰的夠累的,而圖形驗證碼的確是深度學習的一個點,於是乎還是想寫下,瞭解下,至少對概念有點印象,也不枉此行了;
小白使用者,如果對這塊有不對的地方,請各位同學及時提出哈,謝謝啦~
掃盲
深度學習,人工智慧,機器學習,神經網路,這4個詞出現的比較多,但是它們之間有什麼關係呢?尤其,機器學習跟深度學習區別在哪裡??
人工智慧,英文Artificial Intelligence,簡稱AI,那人工智慧的目的是什麼?
網上一大堆,好聽的叫解放/發展生產力,解放人類,總的來說是提高效率
但更好理解就是:偷懶!
比如當你說一句話時,機器能夠識別成文字,並理解你話的意思,進行分析和對話等。
人工智慧的核心在於智慧兩字,那智慧怎麼來的?主要歸功於一種實現人工智慧的方法--機器學習;
那目前人工智慧的應用場景有哪些:
OCR、語音技術(比如Siri)、大資料應用等~
機器學習:一種實現人工智慧的方法
機器學習最基本的做法,是使用演算法來解析資料、從中學習,然後對事件做出決策和預測。
需要用大量的資料來“訓練”,通過各種演算法從資料中學習如何完成任務。
舉個例子,當瀏覽網上商城時,經常會出現商品推薦的資訊。
這是商城根據往期的購物記錄和冗長的收藏清單,識別出這其中哪些是真正感興趣,並且願意購買的產品。
這樣的決策模型,可以幫助商城為客戶提供建議並鼓勵產品消費。
【機器學習有三類】:
第一類是無監督學習,指的是從資訊出發自動尋找規律,並將其分成各種類別,有時也稱"聚類問題"。
第二類是監督學習,監督學習指的是給歷史一個標籤,運用模型預測結果。
如有一個水果,我們根據水果的形狀和顏色去判斷到底是香蕉還是蘋果,這就是一個監督學習的例子。
最後一類為強化學習,是指可以用來支援人們去做決策和規劃的一個學習方式,它是對人的一些動作、行為產生獎勵的回饋機制,通過這個回饋機制促進學習,這與人類的學習相似,所以強化學習是目前研究的重要方向之一。
深度學習:一種實現機器學習的技術
深度學習是機器學習的一個子領域,是利用深度的神經網路,將模型處理得更為複雜,從而使模型對資料的理解更加深入;
深度學習的核心是,我們現在有足夠快的計算機和足夠的資料來實際訓練大型神經網路
三者的區別和聯絡
機器學習是一種實現人工智慧的方法,深度學習是一種實現機器學習的技術。
按照JB的理解,深度學習最終可能會滲透在其他所有機器學習演算法;
當然,並不是說深度學習就是萬能的,也並不一定比機器學習牛逼,要根據場景來區別;
人工神經網路:一種機器學習的演算法
以“停止(Stop)標誌牌”為例,將一個停止標誌牌影像的所有元素都打碎,然後用神經元進行“檢查”:八邊形的外形、消防車般的紅顏色、鮮明突出的字母、交通標誌的典型尺寸和靜止不動運動特性等等。神經網路的任務就是給出結論,它到底是不是一個停止標誌牌。神經網路會根據所有權重,給出一個經過深思熟慮的猜測——“概率向量”。
神經網路是需要調製、訓練的,不然會很容易出錯的~
ok,講到這裡,感覺對這塊資訊已經有所瞭解~至少知道這些是什麼東西了;
簡單總結下:
機器學習是一種實現人工智慧的方法,深度學習是一種實現機器學習的技術,神經網路是一種實現機器學習的演算法
TensorFlow 簡介
TensorFlow是Google在2015年11月份開源的人工智慧系統Github專案地址,該系統可以被用於語音識別、圖片識別等多個領域。
官網上對TensorFlow的介紹是,
一個使用資料流圖技術來進行數值計算的開源軟體庫。
- 資料流圖中的節點,代表數值運算;
- 節點節點之間的邊,代表多維資料(tensors)之間的某種聯絡。
- 可以在多種裝置(含有CPU或GPU)上通過簡單的API呼叫來使用該系統的功能。
TensorFlow是由Google Brain團隊的研發人員負責的專案。
什麼是資料流圖
資料流圖是描述有向圖中的數值計算過程。有向圖中的節點通常代表數學運算,但也可以表示資料的輸入、輸出和讀寫等操作;有向圖中的邊表示節點之間的某種聯絡,它負責傳輸多維資料(Tensors)。
節點可以被分配到多個計算裝置上,可以非同步和並行地執行操作。因為是有向圖,所以只有等到之前的入度節點們的計算狀態完成後,當前節點才能執行操作。
TensorFlow的特性
- 靈活性,TensorFlow不是一個嚴格的神經網路工具包,只要你可以使用資料流圖來描述你的計算過程,你可以使用TensorFlow做任何事情。你還可以方便地根據需要來構建資料流圖,用簡單的Python語言來實現高層次的功能。
- 可移植性,TensorFlow可以在任意具備CPU或者GPU的裝置上執行,你可以專注於實現你的想法,而不用去考慮硬體環境問題,你甚至可以利用Docker技術來實現相關的雲服務。
- 提高開發效率,TensorFlow可以提升你所研究的東西產品化的效率,並且可以方便與同行們共享程式碼- 支援語言選項,目前TensorFlow支援Python和C++語言。
- 充分利用硬體資源,最大化計算效能
TensorFlow安裝
找了很多方式,最終無奈放棄,因為都不可行,依賴的東西太多了,最後JB選擇了用pycharm來安裝TensorFlow;
pycharm是python 的IDE軟體,安裝庫起來比較方便,而且寫程式碼也不錯;
開啟pycharm,在選單欄裡flie-settings,直接搜尋project inter,選擇你用的編譯器,直接點選+:
輸入tensorflow,install package,然後就是等待漫長的安裝過程了;
當然,喜歡高難度的同學,可以看github的官網介紹,祝你好運~
https://github.com/jikexueyuanwiki/tensorflow-zh/blob/master/SOURCE/get_started/os_setup.md
驗證
直接import tensorflow,執行試試看有沒有問題即可;如果有問題,會直接報錯的~
第一個例子
官網有個例子,直接拿來用了:
import tensorflow as tf
hello = tf.constant("Hello,TensorFlow")
#建立了圖,裡面放入hello,TensorFlow
sess = tf.Session()
#定義了一個會話
print(sess.run(hello))
#執行圖計算
a = tf.constant(10)
b = tf.constant(32)
#建立了圖,裡面放兩個節點,兩個Constant()ops
print(sess.run(a+b))
#執行圖計算,此處是相加
複製程式碼
執行結果:
2018-06-14 18:48:55.967672: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
b'Hello,TensorFlow'
42
複製程式碼
上面第一行還是紅色的,雖然不影響結果輸出,但是看著不爽啊;
怎麼做?直接遮蔽就好了~
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2'
複製程式碼
import os,加上上面那句即可;不懂什麼意思?來來來~
os.environ["TF_CPP_MIN_LOG_LEVEL"]='1' # 這是預設的顯示等級,顯示所有資訊
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' # 只顯示 warning 和 Error
os.environ["TF_CPP_MIN_LOG_LEVEL"]='3' # 只顯示 Error
複製程式碼
看了上面的例子,看不出特別的,先來了解下基礎知識吧~
基本使用
需要理解在TensorFlow中,是如何:
- 將計算流程表示成圖;
- 通過Sessions來執行圖計算;
- 將資料表示為tensors;
- 使用Variables來保持狀態資訊;
- 分別使用feeds和fetches來填充資料和抓取任意的操作結果;
TensorFlow的基礎概念
- 圖(Graph):用來表示計算任務,也就我們要做的一些操作。
- 會話(Session):建立會話,此時會生成一張空圖;在會話中新增節點和邊,形成一張圖,一個會話可以有多個圖,通過執行這些圖得到結果。如果把每個圖看做一個車床,那會話就是一個車間,裡面有若干個車床,用來把資料生產成結果。
- Tensor:用來表示資料,是我們的原料。
- 變數(Variable):用來記錄一些資料和狀態,是我們的容器。
- feed和fetch:可以為任意的操作(arbitrary operation) 賦值或者從其中獲取資料。相當於一些鏟子,可以運算元據。
形象的比喻是:把會話看做車間,圖看做車床,裡面用Tensor做原料,變數做容器,feed和fetch做鏟子,把資料加工成我們的結果。
圖計算
TensorFlow程式中圖的建立類似於一個 [施工階段],
而在 [執行階段] 則利用一個session來執行圖中的節點。
很常見的情況是,在 [施工階段] 建立一個圖來表示和訓練神經網路,而在 [執行階段] 在圖中重複執行一系列的訓練操作。
建立圖和執行圖
第一個例子那有說明圖是怎麼建立的,這裡再舉例說明下:
matrix1 = tf.constant([[3.,3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1,matrix2)
#建立一個矩陣乘法
#預設的圖,有3個節點,兩個constant和一個matmul
sess = tf.Session()
#定義一個會話
result = sess.run(product)
#運算乘法,得到結果
print(result)
sess.close()
#關閉會話
複製程式碼
如果需要使用GPU,則如下處理:
with tf.Session() as sess:
with tf.device("/cpu:0"):
matrix1 = tf.constant([[3,3]])
#這是一行2列
matrix2 = tf.constant([[2],[2]])
#這個是兩行1列
product = tf.matmul(matrix1,matrix2)
#建立一個矩陣乘法
#預設的圖,有3個節點,兩個constant和一個matmul
sess = tf.Session()
#定義一個會話
result = sess.run(product)
#運算乘法,得到結果
print(result)
sess.close()
#關閉會話
複製程式碼
device中的各個字串含義如下:
- "/cpu:0": 你機器的CPU;
- "/gpu:0": 你機器的第一個GPU;
- "/gpu:1": 你機器的第二個GPU;
常量
tf.constant(value, dtype=None, shape=None, name='Const', verify_shape=False),value為值,dtype型別,shape為張量形狀,name名稱、verify_shape預設False,這些項可選。作用建立一個常量。
a = tf.constant(2, name="a") # print(a) = 2
b = tf.constant(2.0, dtype=tf.float32, shape=[2,2], name="b") # 2x2矩陣,值為2
c = tf.constant([[1, 2], [3, 4]], name="c") # 2x2矩陣,值1,2,3,4
複製程式碼
是不是懵逼了?沒事,留個大概影響就好了~
第二個例子--建立變數
num = tf.Variable(0,name = "count")
#建立一個變數num
new_value = tf.add(num,10)
#建立一個加法操作,把當前的數字+10
op = tf.assign(num,new_value)
#建立一個賦值操作,把new_value賦值給num
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
#初始化變數
print(sess.run(num))
for i in range(5):
#建立一個for迴圈,迴圈5次
sess.run(op)
#執行op的賦值操作
print(sess.run(num))
#輸出num
輸出的結果:
0
10
20
30
40
50
複製程式碼
第三個例子--填充
有的時候,會在宣告變數的時候不賦值,計算的時候才進行賦值,這個時候feed就派上用場了
input1 = tf.placeholder(tf.float32)
#建立一個變數佔位符input1
input2 = tf.placeholder(tf.float32)
#建立一個變數佔位符input2
mul = tf.multiply(input1, input2)
#乘法操作
with tf.Session() as sess:
result = sess.run([mul], feed_dict={input1:[7.], input2:[2.]})
#在運算時,用feed設定兩個輸入的值
print(result)
複製程式碼
綜合例子
import tensorflow as tf
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2'
import numpy as np
x_data = np.random.rand(100).astype("float32")
y_data = x_data * 0.1 + 0.3
# 模擬生成100對資料對, 對應的函式為y = x * 0.1 + 0.3
# numpy是Python的一個科學計算庫,提供矩陣運算的功能
# astype是轉換陣列的資料型別
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
#產生尺寸為1的張量
y = W * x_data + b
# 指定w和b變數的取值範圍(注意我們要利用TensorFlow來得到w和b的值)
# tf.random_uniform,TensorFlow隨機值函式,返回1矩陣,數值產生於-1.0跟1.0之間
loss = tf.reduce_mean(tf.square(y - y_data))
#reduce_mean求平均值
#square是對裡面的值求平方操作
optimizer = tf.train.GradientDescentOptimizer(0.5)
#這個類是實現梯度下降演算法的優化器,第一個引數是要使用的學習率
train = optimizer.minimize(loss)
# 最小化均方誤差
init = tf.global_variables_initializer()
# 初始化TensorFlow引數
sess = tf.Session()
sess.run(init)
# 執行資料流圖(注意在這一步才開始執行計算過程)
for step in range(201):
sess.run(train)
if step % 20 == 0:
print(step, sess.run(W), sess.run(b))
# 觀察多次迭代計算時,w和b的擬合值
# 最好的情況是w和b分別接近甚至等於0.1和0.3
複製程式碼
輸出的結果:
0 [-0.39065683] [0.66207296]
20 [-0.0082044] [0.3498935]
40 [0.07841039] [0.30995506]
60 [0.09569232] [0.3019863]
80 [0.09914052] [0.30039632]
100 [0.09982852] [0.30007908]
120 [0.09996579] [0.30001578]
140 [0.09999318] [0.30000314]
160 [0.09999864] [0.30000064]
180 [0.09999974] [0.30000013]
200 [0.09999995] [0.30000004]
複製程式碼
每執行20次輸出一次資料,從上面的結果可以看到,隨著次數的增加,w跟b的值越來越靠近0.1跟0.3;
JB很好奇,為什麼會這這樣?從上面的程式碼,沒做什麼嗎?這個呢?估計要看TensorFlow的原始碼了,感興趣的同學,看完後記得分享下~
本章就介紹到這裡了,本來還想介紹hello world的,但是考慮整體章節會比較長,就放下文吧~
小結
來個例行總結,本文主要講解人工智慧的相關概念,以及TensorFlow的基礎用法,也結合一個例子來證明TensorFlow的效果,至於原始碼嘛,JB也不懂,就是覺得TensorFlow很牛逼的感覺~
而我們最終的目的,是希望用TensorFlow來訓練自己的模型,來提高圖形驗證碼的識別率;
謝謝大家~