摘要: 谷歌開源的AI開發工具TensorFlow,了解一下?
- GitHub倉庫:Fundebug/tensorflow-101
谷歌的AI技術獨步天下,從即將商業化運營的無人駕駛汽車Waymo,到天下無敵的圍棋大師AlphaGo,再到以假亂真的電話助理Duplex…
如果你想學習AI技術的話,神經網絡是個不錯的學習方向,因為它是最神奇也是現在最有效的機器學習算法;如果你想學習神經網絡的話,最好的起點是實現一個簡單的神經網絡,因為你可以在實現的過程中發現問題,思考問題以及解決問題;如果你想實現一個簡單的神經網絡的話,本文將教你使用TensorFlow來實現;至少,你可以直接運行本文給出的例子,感受一下神經網絡的神奇。
TensorFlow簡介
TensorFlow是谷歌開源的AI開發工具,可以用於實現普通的機器學習算法(linear regression,logistic regression),也可以用於實現深度學習算法(各種不同類型的神經網絡)。TensorFlow為深度學習進行了大量優化,使用TensorFlow提供的API,AI開發者能夠更加簡單地實現神經網絡算法。
鳶尾花分類
下圖是3種不同的鳶尾花,從左至右分別是setosa, virginica和versicolor。3種鳶尾花的花萼和花瓣的長寬各有不同。
iris_training.csv是訓練數據,它提供了120個鳶尾花的花萼和花瓣的長寬數據,並且標記了所屬的鳶尾花類別。
根據訓練數據,你可以總結出鳶尾花的花萼和花瓣的長寬與其所屬類別的關系嗎?120個數據不算太多,但是對人來說並不簡單。
在本文中,我們將使用TesorFlow訓練一個簡單的神經網絡,來識別鳶尾花的類別。
代碼解釋
train.py訓練神經網絡的代碼:
# -*- coding: utf-8 -*- |
由代碼可知,從導入訓練數據,到定義神經網絡模型的層數以及激勵函數,再到定義損失計算函數、梯度計算函數和優化器,都使用了TensorFlow提供的API。這樣,開發者不再需要去實現底層的細節,可以根據需要靈活地調整神經網絡的結構以及所使用的各種函數。
其中,定義神經網絡的代碼如下:
MODEL = tf.keras.Sequential([ |
可知,這是一個4層的神經網絡,包含1個輸入層,2個隱藏層和1個輸出層,2個隱藏層都有10個神經元,使用RELU作為激勵函數,如下圖所示:
訓練代碼最核心的是部分train函數:
def train(): |
train函數的算法是這樣的:
- 迭代計算200個epoch,每一個epoch迭代都會掃描整個訓練數據集;
- 每個epoch中,會iterate整個訓練數據集中的120個樣本,其batch size為32,所以一個epoch需要4個iteration;
- 每個iteration中,根據樣本的特征值(花萼和花瓣的長寬),使用神經網絡做出預測(所屬鳶尾花類別),與真實的標記值進行比較,計算損失及梯度。
- 每個iteration中,根據所計算的梯度,使用優化器修改神經網絡中的參數值。
- 經過200個epoch,神經網絡中的參數將會調整到最優值,使得其預測結果誤差最低。
基於Docker運行TensorFlow
將TensorFlow以及代碼都打包到Docker鏡像中,就可以在Docker容器中運行TensorFlow。這樣,開發者僅需要安裝Docker,而不需要安裝TensorFlow;同時,Docker保證了代碼一定可以在任何Docker主機上正確執行,因為它所依賴的運行環境全部打包在Docker鏡像中。Docker鏡像使用Dockerfile定義。
克隆代碼
git clone https://github.com/Fundebug/tensorflow-101.git |
構建鏡像
sudo docker build -t tensorflow . |
運行容器
sudo docker run -i tensorflow python src/main.py |
運行結果
訓練: |
由結果可知,對於測試數據集iris_test.csv,所訓練的神經網絡的准確率高達96.667%,是不是很神奇呢?