[Python人工智能] 一.TensorFlow环境搭建及神经网络入门
從本篇文章開始,作者正式開始研究Python深度學習、神經網絡及人工智能相關知識。第一篇文章主要講解神經網絡基礎概念,同時講解TensorFlow2.0的安裝過程及基礎用法,主要結合作者之前的博客和"莫煩大神"的視頻介紹,后面隨著深入會講解具體的項目及應用。基礎性文章,希望對您有所幫助,如果文章中存在錯誤或不足之處,還請海涵~同時自己也是人工智能的菜鳥,希望大家能與我在這一筆一劃的博客中成長起來。
文章目錄
- 一.白話神經網絡
- 二.神經網絡概念梳理
- 三.TensorFlow
- 1.TensorFlow簡介
- 2.安裝過程
- 3.基礎入門
- 四.總結
同時推薦前面作者另外三個Python系列文章。從2014年開始,作者主要寫了三個Python系列文章,分別是基礎知識、網絡爬蟲和數據分析。2018年陸續增加了Python圖像識別和Python人工智能專欄。
- Python基礎知識系列:Pythonj基礎知識學習與提升
- Python網絡爬蟲系列:Python爬蟲之Selenium+Phantomjs+CasperJS
- Python數據分析系列:知識圖譜、web數據挖掘及NLP
- Python圖像識別系列:Python圖像處理及圖像識別
代碼下載地址(歡迎大家關注點贊):
- https://github.com/eastmountyxz/AI-for-TensorFlow
- https://github.com/eastmountyxz/AI-for-Keras
作者theano人工智能系列:
[Python人工智能] 一.神經網絡入門及theano基礎代碼講解
[Python人工智能] 二.theano實現回歸神經網絡分析
[Python人工智能] 三.theano實現分類神經網絡及機器學習基礎
[Python人工智能] 四.神經網絡和深度學習入門知識
[Python人工智能] 五.theano實現神經網絡正規化Regularization處理
[Python人工智能] 六.神經網絡的評價指標、特征標準化和特征選擇
[Python人工智能] 七.加速神經網絡、激勵函數和過擬合
參考文獻:
神經網絡和機器學習基礎入門分享 - 作者的文章
Stanford機器學習—第五講. 神經網絡的學習 Neural Networks learning
吳祖增前輩:神經網絡入門(連載之一)
吳祖增前輩:神經網絡入門(連載之二)
斯坦福機器學習視頻NG教授: https://class.coursera.org/ml/class/index
書籍《游戲開發中的人工智能》、《游戲編程中的人工智能技術》
網易云莫煩老師視頻(強推):https://study.163.com/course/courseLearn.htm?courseId=1003209007
TensorFlow在Win10上的安裝教程和簡單示例 - Suffering
[Tensorflow2.0] Tensorflow2.0的安裝教程 - 牛andmore牛
一.白話神經網絡
第一部分將簡單講解"莫煩大神"網易云課程對神經網絡的介紹,講得清晰透徹,推薦大家閱讀;第二部分將講述我的理解。開始吧!讓我們一起進入神經網絡和TensorFlow的世界。
首先,什么是神經網絡(Neural Networks)?
計算機神經網絡是一種模仿生物神經網絡或動物神經中樞,特別是大腦的結構和功能,它是一種數學模型或計算機模型。神經網絡由大量的神經元連接并進行計算,大多數情況下人工神經網絡能在外界信息的基礎上改變內部結構,是一種自適應的過程。
現代神經網絡是一種基于傳統統計學建模的工具,常用來對輸入和輸出間復雜的關系進行建模,或探索數據間的模式,神經網絡是一種運算模型,有大量的節點或神經元及其聯系構成。和人類的神經元一樣,它們負責傳遞信息和加工信息,神經元也能被訓練或強化,形成固定的神經形態,對特殊的信息有更強烈的反應。
神經網絡是如何工作的呢?
如上圖所示,不管這是一只跳躍飛奔的貓,或是一只靜靜思考的貓,你都知道它是一只貓,因為你的大腦已經被告知過圓眼睛、毛茸茸、尖耳朵的就是貓,你通過成熟的視覺神經系統判斷它是貓。計算機也是一樣,通過不斷的訓練,告訴哪些是貓、哪些是狗、哪些是豬,它們會通過數學模型來概括這些學習的判斷,最終以數學的形式(0或1)來分類。目前,谷歌、百度圖片搜索都能清晰識別事物,這些都歸功于計算機神經系統的飛速發展。
神經網絡系統由多層神經層構成,為了區分不同的神經層,我們分為:
- 輸入層:直接接收信息的神經層,比如接收一張貓的圖片
- 輸出層:信息在神經元中傳遞中轉和分析權衡,形成輸出結果,通過該層輸出的結果可以看出計算機對事物的認知
- 隱藏層:在輸入和輸出層之間的眾多神經元連接組成的各個層面,可以有多層,負責對傳入信息的加工處理,經過多層加工才能衍生出對認知的理解
神經網絡舉例說明
如下圖所示,通常來說,計算機處理的東西和人類有所不同,無論是聲音、圖片還是文字,它們都只能以數字0或1出現在計算機神經網絡里。神經網絡看到的圖片其實都是一堆數字,對數字的加工處理最終生成另一堆數字,并且具有一定認知上的意義,通過一點點的處理能夠得知計算機到底判斷這張圖片是貓還是狗。
計算機是怎么訓練的呢?
首先,需要很多的數據,比如需要計算機判斷是貓還是狗,就需要準備上千萬張有標記的圖片,然后再進行上千萬次的訓練。計算機通過訓練或強化學習判斷貓,將獲取的特征轉換為數學的形式。
我們需要做的就是只給計算機看圖片,然后讓它給我們一個不成熟也不準確的答案,有可能100次答案中有10%是正確的。如果給計算機看圖片是一張飛奔的貓(如下圖),但計算機可能識別成一條狗,盡管它識別錯誤,但這個錯誤對計算機是非常有價值的,可以用這次錯誤的經驗作為一名好老師,不斷學習經驗。
那么計算機是如何學習經驗的呢?
它是通過對比預測答案和真實答案的差別,然后把這種差別再反向傳遞回去,修改神經元的權重,讓每個神經元向正確的方向改動一點點,這樣到下次識別時,通過所有改進的神經網絡,計算機識別的正確率會有所提高。最終每一次的一點點,累加上千萬次的訓練,就會朝正確的方向上邁出一大步。
最后到驗收結果的時候,給計算機再次顯示貓的圖片時,它就能正確預測這是一只貓。
激勵函數是什么東東?
接著再進一步看看神經網絡是怎么訓練的。原來在計算機里每一個神經元都有屬于它的激勵函數(Active Function),我們可以利用這些激勵函數給計算機一個刺激行為。當我們第一次給計算機看一只飛奔的貓時,神經網絡中只有部分神經元被激活或激勵,被激活傳遞下去的信息是計算機最為重視的信息,也是對輸出結果最有價值的信息。
如果預測的結果是一只狗,所有神經元的參數就會被調整,這時有一些容易被激活的神經元就會變得遲鈍,而另一些會變得敏感起來,這就說明了所有神經元參數正在被修改,變得對圖片真正重要的信息敏感,從而被改動的參數就能漸漸預測出正確的答案,它就是一只貓。這就是神經網絡的加工過程。
二.神經網絡概念梳理
前面通過白話文講述了神經網絡之后,接下來我們對神經網絡的概念從頭再梳理一遍,這也是為后續深入學習奠定基礎。
神經網絡(也稱人工神經網絡,ANN)算法是80年代機器學習界非常流行的算法,不過在90年代中途衰落。現在,攜著“深度學習”之勢,神經網絡重裝歸來,重新成為最強大的機器學習算法之一。
人工神經網絡(Artificial Neural Network,縮寫ANN),是一種模仿生物神經網絡的結構和功能的數學模型或計算模型。神經網絡由大量的人工神經元聯結進行計算。其來源于生物,故吳老先先講述了生物神經網絡的基礎知識,從而進行引入。
神經細胞通過軸突將信號傳遞給其他的神經細胞,通過樹突向各個方向接受信號。
神經細胞利用電-化學過程交換信號。輸入信號來自另一些神經細胞。這些神經細胞的軸突末梢(也就是終端)和本神經細胞的樹突相遇形成突觸(synapse),信號就從樹突上的突觸進入本細胞。
信號在大腦中實際怎樣傳輸是一個相當復雜的過程,但就我們而言,重要的是把它看成和現代的計算機一樣,利用一系列的0和1來進行操作。就是說,大腦的神經細胞也只有兩種狀態:興奮(fire)和不興奮(即抑制)。
神經細胞利用一種我們還不知道的方法,把所有從樹突突觸上進來的信號進行相加,如果全部信號的總和超過某個閾值,就會激發神經細胞進入興奮(fire)狀態,這時就會有一個電信號通過軸突發送出去給其他神經細胞。如果信號總和沒有達到閾值,神經細胞就不會興奮起來。這樣的解釋有點過分簡單化,但已能滿足我們的目的。
由于人腦具有一下幾個特點:
- 能實現無監督的學習
大腦能夠自己進行學習,而不需要導師的監督教導。如果一個神經細胞在一段時間內受到高頻率的刺激,則它和輸入信號的神經細胞之間的連接強度就會按某種過程改變,使得該神經細胞下一次受到激勵時更容易興奮。 - 對損傷有冗余性(tolerance)
大腦即使有很大一部分受到了損傷, 它仍然能夠執行復雜的工作。 - 處理信息的效率極高
神經細胞之間電-化學信號的傳遞,與一臺數字計算機中CPU的數據傳輸相比,速度是非常慢的,但因神經細胞采用了并行的工作方式,使得大腦能夠同時處理大量的數據。例如,大腦視覺皮層在處理通過我們的視網膜輸入的一幅圖象信號時,大約只要100ms的時間就能完成,眼睛并發執行。 - 善于歸納推廣
大腦和數字計算機不同,它極擅長的事情之一就是模式識別,并能根據已熟悉信息進行歸納推廣(generlize)。例如,我們能夠閱讀他人所寫的手稿上的文字,即使我們以前從來沒見過他所寫的東西。 - 它是有意識的
如下圖所示,它表示的是一個人工神經細胞。其中:
- 輸入(Input)
- 權重(Weight):左邊五個灰色圓底字母w代表浮點數
- 激勵函數(Activation Function):大圓,所有經過權重調整后的輸入加起來,形成單個的激勵值
- 輸出(Output):神經細胞的輸出
進入人工神經細胞的每一個input(輸入)都與一個權重w相聯系,正是這些權重將決定神經網絡的整體活躍性。假設權重為-1和1之間的一個隨機數,權重可正可負(激發和抑制作用)。當輸入信號進入神經細胞時,它們的值將與它們對應的權重相乘,作為圖中大圓的輸入。如果激勵值超過某個閥值(假設閥值為1.0),就會產生一個值為1的信號輸出;如果激勵值小于閥值1.0,則輸出一個0。這是人工神經細胞激勵函數的一種最簡單的類型。涉及的數學知識如下圖所示:
如果最后計算的結果激勵值大于閾值1.0,則神經細胞就輸出1;如果激勵值小于閾值則輸出0。這和一個生物神經細胞的興奮狀態或抑制狀態是等價的。下面圖是通過神經網絡實現邏輯表達式與運算:(參考NG斯坦福機器學習講義)
可以看到x1和x2變量作為神經網絡的輸入,當它們取不同的0或1值時,其結果通過sigmod函數計算的值是不同的。它模擬了整個AND運算。
該圖中神經網絡共有三層 ( 注輸入層不是神經細胞,神經細胞只有兩層 ):
輸入層中的每個輸入都饋送到了隱藏層,作為該層每一個神經細胞的輸入;然后,從隱藏層的每個神經細胞的輸出都連到了它下一層(即輸出層)的每一個神經細胞。
注意:
1.圖中僅僅畫了一個隱藏層,作為前饋網絡,一般地可以有任意多個隱藏層。但在對付你將處理的大多數問題時一層通常是足夠的。
2.事實上,有一些問題甚至根本不需要任何隱藏單元,你只要把那些輸入直接連結到輸出神經細胞就行了。
3.每一層實際都可以有任何數目的神經細胞,這完全取決于要解決的問題的復雜性。但神經細胞數目愈多,網絡的工作速度也就愈低,網絡的規模總是要求保持盡可能的小。
神經網絡體系創建成功后,它必須接受訓練來認出數字4,方法:
1.先把神經網絡的所有權重初始化為任意值;
2.再給他一系列輸入代表面板不同配置的輸入,對每種輸入配置,檢查它的輸出是什么,并調整相應權重;
3.如果我們送給網絡的輸入模式不是4,則我們知道網絡應該輸出一個0。因此每個非4字符時,網絡權重應進行調整,使得它的輸出趨向于0;當代表4的模式輸送給網絡時,則應把權重調整到使其輸出趨向于1;
4.我們可以進一步識別0到9的所有數字或字母,其本質是手寫識別的工作原理。
5.最后,網絡不單能認識已經訓練的筆跡,還顯示了它有顯著的歸納和推廣能力。
正是這種歸納推廣能力,使得神經網絡已經成為能夠用于無數應用的一種無價的工具,從人臉識別、醫學診斷,直到跑馬賽的預測,另外還有電腦游戲中的bot(作為游戲角色的機器人)的導航,或者硬件的robot(真正的機器人)的導航。
上圖會演示神經網絡在圖像識別領域的一個著名應用,這個程序叫做LeNet,是一個基于多個隱層構建的神經網絡。通過LeNet可以識別多種手寫數字,并且達到很高的識別精度與擁有較好的魯棒性。LeNet的發明人是機器學習的大牛Yann LeCun(目前google)。
右下方的方形中顯示的是輸入計算機的圖像,方形上方的紅色字樣“answer”后面顯示的是計算機的輸出。左邊的三條豎直的圖像列顯示的是神經網絡中三個隱藏層的輸出,可以看出,隨著層次的不斷深入,越深的層次處理的細節越低,例如層3基本處理的都已經是線的細節了。
這種類型的訓練稱作有監督的學習(supervised learnig),用來訓練的數據稱為訓練集(training set)。調整權重可以采用許多不同的方法。對本類問題最常用的方法就是反向傳播(backpropagation,簡稱backprop或BP)方法,即BP神經網絡。
你自己可以去學習另外的一種訓練方式,即根本不需要任何導師來監督的訓練,或稱無監督學習(unsupervised learnig)。下圖是神經網絡的簡單回顧與總結:
最后給大家看一個利用神經網絡對圖片進行分類的例子:過程就不詳細論述了,圖片很清晰,對人、汽車、摩托車、卡車進行圖片識別,而具體的隱藏層函數需要大家去深入研究,我自己研究得也很淺顯,抱歉~
三.TensorFlow
1.TensorFlow簡介
TensorFlow?是一個基于數據流編程(dataflow programming)的符號數學系統,被廣泛應用于各類機器學習(machine learning)算法的編程實現,其前身是谷歌的神經網絡算法庫DistBelief 。Tensorflow擁有多層級結構,可部署于各類服務器、PC終端和網頁并支持GPU和TPU高性能數值計算,被廣泛應用于谷歌內部的產品開發和各領域的科學研究 。
TensorFlow由谷歌人工智能團隊谷歌大腦(Google Brain)開發和維護,擁有包括TensorFlow Hub、TensorFlow Lite、TensorFlow Research Cloud在內的多個項目以及各類應用程序接口(Application Programming Interface, API)。
TensorFlow官網:https://tensorflow.google.cn/
TensorFlow 是一個端到端開源機器學習平臺。它擁有一個包含各種工具、庫和社區資源的全面靈活生態系統,可以讓研究人員推動機器學習領域的先進技術的發展,并讓開發者輕松地構建和部署由機器學習提供支持的應用。總之,如果有TensorFlow,我們就可以很自如地玩轉神經網絡。
2.安裝過程
TensorFlow即可以支持CPU,也可以支持CPU+GPU。前者的環境需求簡單,后者需要額外的支持。TensorFlow的安裝方式很多,包括:
- pip 安裝
- virtualenv安裝
- docker安裝
- 從安裝源安裝
本文將使用pip安裝,pip在每個系統的安裝方式包括:
- Linux \ MacOS \ Windows
- CPU版 \ GPU版(GPU版本比CPU版本快很多倍)
- 測試版
- 更新TensorFlow
TensorFlow支持Windows用戶,由于我的計算機是Windows操作系統,這里使用該方法進行安裝,這里安裝的環境為:Windows10+CPU+TensorFlow2.0+Anaconda+Python3.6
第一步:官網下載Anaconda并安裝
第二步:安裝Anaconda之后,打開“Anaconda Prompt”命令行,檢查Anaconda是否安裝成功及環境
//檢查Anaconda是否成功安裝 conda --version //檢測目前安裝了哪些環境 conda info --envs第三步:檢查當前環境可以安裝哪些版本的Python,作者選擇Python3.6版本
conda search --full-name python由于作者電腦不支持GPU,所以這里只安裝CPU版本,GPU安裝推薦下面文章。
tensorflow2.0GPU版本的環境配置與安裝教程 normalization
[Tensorflow2.0] Tensorflow2.0的安裝教程 - 牛andmore牛
第四步:創建環境,用來安裝tensorflow2.0以及相關的python packages
conda create -n tf2 python=3.6第五步:激活TensorFlow
activate tf2第六步:安裝cpu版本TensorFlow
pip install tensorflow==2.0.0-alpha0- conda search tensorflow #搜CPU版
- conda search tensorflow-gpu #搜GPU版
- conda install tensorflow=2.0.0 #安裝CPU版
- conda install tensorflow-gpu=2.0.0 #安裝GPU版
此時,表示安裝結束,接下來開始確認我們是否安裝成功。
第七:打開Anaconda Navigator,選擇環境“tf2”,點擊spyder下面的“install”。
安裝好就變成“Launch”了,點擊就可以進去了。
第八步:輸入代碼驗證是否安裝成功。
import tensorflow as tf print(tf.__version__)如果需要退出環境,可以輸入下面命令。
3.基礎入門
最后給出一個簡單的實例代碼:
# -*- coding: utf-8 -*- """ Spyder EditorThis is a temporary script file.By:Eastmount CSDN YXZ 2019-11-28 """import tensorflow as tf #查詢TensorFlow版本 print(tf.__version__)#定義a和b為兩個常量 a = tf.constant([1, 2], name="a") b = tf.constant([2, 3], name="b") print(a) print(b)#隨機生成一個正態分布 output = tf.random.normal([5,3]) print(output)#創建2個矩陣并進行相乘 matrix1 = tf.constant([[3,3]]) matrix2 = tf.constant([[1, 2],[3, 4]]) product = tf.matmul(matrix1,matrix2) print(matrix1) print(matrix2) print(product) print(product.numpy())輸出結果如下所示:
2.0.0-alpha0tf.Tensor([1 2], shape=(2,), dtype=int32) tf.Tensor([2 3], shape=(2,), dtype=int32)tf.Tensor( [[-2.1826832 -0.32986134 -1.6238695 ][-0.18214056 0.25923613 -0.12570491][ 1.0550841 -0.6655764 -1.5837296 ][-0.10004017 0.0162886 0.9483853 ][ 0.4709251 -0.18713968 0.8347026 ]], shape=(5, 3), dtype=float32)tf.Tensor([[3 3]], shape=(1, 2), dtype=int32) tf.Tensor( [[1 2][3 4]], shape=(2, 2), dtype=int32)tf.Tensor([[12 18]], shape=(1, 2), dtype=int32) [[12 18]]四.總結
最后希望基礎性文章對您有所幫助,作者也是這個領域的菜鳥一枚,希望與您共同進步,后續會繼續深入分享Python人工智能系列,如果喜歡點個贊評論,共勉~
中午驚喜收到女神的小蛋糕,下午期末考試,一直忙到凌晨2點,靜寂中又漲了一歲。花開蝴蝶自然來,希望自己一直善良下去,品嘗到更多幸福的味道。感謝這些年所有幫助和祝福我的人,無以回報,只能去幫助更多的人,分享更好的博客,備好每一次講臺前的課程。忙中帶樂,晚安娜,明天接著奮斗~
(By:Eastmount 2019-11-28 下午4點 http://blog.csdn.net/eastmount/ )
總結
以上是生活随笔為你收集整理的[Python人工智能] 一.TensorFlow环境搭建及神经网络入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【python数据挖掘课程】二十九.数据
- 下一篇: websocket python爬虫_p