JB的Python之旅-人工智能篇-TensorFlow基礎概念

前言

猶記得一週前,對圖形驗證碼有點想法,自信滿滿的去作破解的工做,可是實際被各類打臉,不接觸這行,真不懂裏面的套路;
python

關於圖形驗證碼這塊,無論後面行仍是不行,都會寫一篇出來,當作經驗總結也好,但總不能停留在這裏,由於後面還有滑動驗證碼,點觸驗證碼等着去學習;

開篇

當今在互聯網混,不隨口說出深度學習,人工智能,機器學習,神經網絡等詞,人家都懷疑是個假的互聯網人了,但不知道是否有同窗跟JB同樣,傻傻分不清?
git

猶記得,自從阿法狗那波,業界彷佛對機器學習推到一個新的高度??
原本是不太想沾這趟水的,畢竟知道本身不是那個料,可是最近被驗證碼折騰的夠累的,而圖形驗證碼的確是深度學習的一個點,因而乎仍是想寫下,瞭解下,至少對概念有點印象,也不虛此行了;
小白用戶,若是對這塊有不對的地方,請各位同窗及時提出哈,謝謝啦~

掃盲

深度學習,人工智能,機器學習,神經網絡,這4個詞出現的比較多,可是它們之間有什麼關係呢?尤爲,機器學習跟深度學習區別在哪裏??github

人工智能,英文Artificial Intelligence,簡稱AI,那人工智能的目的是什麼?
網上一大堆,好聽的叫解放/發展生產力,解放人類,總的來講是提升效率
但更好理解就是:偷懶!
算法

好比當你說一句話時,機器可以識別成文字,並理解你話的意思,進行分析和對話等。
數組

人工智能的核心在於智能兩字,那智能怎麼來的?主要歸功於一種實現人工智能的方法--機器學習
網絡

那目前人工智能的應用場景有哪些:
OCR、語音技術(好比Siri)、大數據應用等~session

機器學習:一種實現人工智能的方法
機器學習最基本的作法,是使用算法來解析數據、從中學習,而後對事件作出決策和預測。
須要用大量的數據來「訓練」,經過各類算法從數據中學習如何完成任務。dom

舉個例子,當瀏覽網上商城時,常常會出現商品推薦的信息。
這是商城根據往期的購物記錄和冗長的收藏清單,識別出這其中哪些是真正感興趣,而且願意購買的產品。
這樣的決策模型,能夠幫助商城爲客戶提供建議並鼓勵產品消費。機器學習

【機器學習有三類】:異步

第一類是無監督學習,指的是從信息出發自動尋找規律,並將其分紅各類類別,有時也稱"聚類問題"。

第二類是監督學習,監督學習指的是給歷史一個標籤,運用模型預測結果。
若有一個水果,咱們根據水果的形狀和顏色去判斷究竟是香蕉仍是蘋果,這就是一個監督學習的例子。

最後一類爲強化學習,是指能夠用來支持人們去作決策和規劃的一個學習方式,它是對人的一些動做、行爲產生獎勵的回饋機制,經過這個回饋機制促進學習,這與人類的學習類似,因此強化學習是目前研究的重要方向之一。

深度學習:一種實現機器學習的技術
深度學習是機器學習的一個子領域,是利用深度的神經網絡,將模型處理得更爲複雜,從而使模型對數據的理解更加深刻;

深度學習的核心是,咱們如今有足夠快的計算機和足夠的數據來實際訓練大型神經網絡

三者的區別和聯繫
機器學習是一種實現人工智能的方法,深度學習是一種實現機器學習的技術。

按照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來訓練本身的模型,來提升圖形驗證碼的識別率;

謝謝你們~

相關文章
相關標籤/搜索