天天看點

從零開始學TensorFlow

從零開始學TensorFlow

前言

隻有光頭才能變強。
文本已收錄至我的GitHub倉庫,歡迎Star: https://github.com/ZhongFuCheng3y/3y
從零開始學TensorFlow

最近在學習TensorFlow的相關知識,了解了TensorFlow一些基礎的知識,現在周末有空了,就寫寫一些筆記,記錄一下自己的成長~

總的來說,TensorFlow還是一個比較新的技術,有興趣的同學不妨跟着我的筆記,一起學學呗(反正沒壞處)~

前面回顧:

知識背景:沒有Python基礎,沒有機器學習基礎,可以說是真正從零學TensorFlow的了。

一、安裝Tensorflow所需要的環境

1.1安裝Python環境

使用環境:Mac

Python有好多個版本,在Mac中自帶的Python版本是

2.7

,但相對而言比較老了。現在一般用

Python3.x

了,本次下載下傳的版本是

3.5.6

我安裝Python所使用方法的大緻步驟:

  • 安裝Homebrew
  • 安裝pyenv
  • .bash_profile

    添加環境變量
  • 讓環境變量生效
  • 安裝

    3.X版本python

詳情可參考如下的連結(總的來說,我根據下面的教程一下子就安裝了我想要的Python版本,還是非常不錯的。):

在安裝Python的時候也發現了一個小知識點:

  • Mac一般使用bash作為預設的shell,會有好幾個環境變量,其中

    etc/profile

    是系統級的,還有幾個使用者級别的環境變量,比如說:

    ~/.bash_profile

  • 如果修改的是系統級别的環境變量,也就是

    etc/profile

    ,在儲存的時候隻能是

    :wq

    !覆寫,不然會出現readonly錯誤

(至于TensorFlow和numpy依賴的下載下傳,這裡我就不說了,就兩條指令就搞掂啦)

1.2PyCharm編輯器

Java有

IDEA

神器,同樣的,Python也有

PyCharm

,同樣是JetBrains出産的。

我在之前從來沒使用過PyCharm,也沒寫過一句的Python代碼。

把Pycharm安裝好了之後,我想當然就

new project

去用了,然後就

next,next,next

,當成IDEA來用。但發現了一個問題:我在之前明明裝好了TensorFlow和numpy的依賴,在PyCharm環境下卻識别不出來!在指令行視窗下,依賴是存在的!

後來才發現:如果用PyCharm去new一個project,會預設建一個解析器在目前的項目目錄下。而PyCharm會遵守“就近原則”使用目前項目路徑下的解析器。而我們添加的依賴(TensorFlow、numpy)是在我們安裝Python的路徑下的,這就導緻了在指令行下找到依賴,而在PyCharm中找不到依賴。

解決也很簡單:在PyCharm指定一下我們安裝Python的路徑,切換一下就好了。

參考資料:

二、體驗TensorFlow

好的,我們現在已經安裝好TensorFlow所需要的環境了!(看起來好簡單,但還是花了我不少時間....)

官網的Demo連結(需要科學上網):

首先我們來看一下這個例子可以幹些什麼:我們有非常多張的圖檔(資料集),這些圖檔有不同的類型(比如衣服、鞋子、褲子,一共有10種類型),把這些資料集扔進我們的神經網絡裡頭,生成出模型。有了模型以後,當我們再将類似的圖檔扔進去,這個模型可以幫我們預測這張圖檔是衣服還是鞋子還是褲子。

從零開始學TensorFlow

随後,我跟着官網的代碼跑了一(代碼我都隻是一步一步複制粘貼),最後跑起來:

# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras

# Helper libraries
import numpy as np

print(tf.__version__)

# 加載資料、區分出測試資料和訓練資料
# 注意:如果已經下過,重複下載下傳的話,可能會出現EOFError: Compressed file ended before the end-of-stream marker was reached錯誤

fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

# 分類的清單
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

# 檢視資料的值
print(train_images.shape)  # 樣本的shape(可以看出有多少條樣本、次元)
print(len(train_labels))  # label的個數,有多少個樣本,就應該有多少個label
print(train_labels)  # label的值,對應上面分類清單(從0到9)


# 對測試資料和訓練資料進行預處理(實際上就是歸一化)
train_images = train_images / 255.0
test_images = test_images / 255.0

# 設定層  (初始處理)--- 建立神經層
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])


# 損失函數、優化器、名額
model.compile(optimizer=tf.train.AdamOptimizer(),
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# 将訓練集丢進去,訓練出模型(Model)
model.fit(train_images, train_labels, epochs=5)

# 将測試資料丢到模型中,評估一下得分(準确率)
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)

# 評估完準确率以後,我們可以對測試資料進行預測
predictions = model.predict(test_images)

# 選第一個樣本預測後的得出最有可能結果
print(np.argmax(predictions[0]))

# 對比結果
print(test_labels[0])           

跑出來的結果:

(後期注釋:這是TensorFlow的版本)

1.12.0

(後期注釋:這是TensorFlow下載下傳資料集的日志)

Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
32768/29515 [=================================] - 0s 3us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz

26427392/26421880 [==============================] - 12s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
8192/5148 [===============================================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz

4423680/4422102 [==============================] - 2s 0us/step           

(後期注釋:樣本的shape)

(60000, 28, 28)

(後期注釋:樣本有多少條,對應的label就有多少條)

60000

(後期注釋:label的值是從0-9,表示有九種類别)

[9 0 0 ... 3 0 5]

(後期注釋:開始訓練)

Epoch 1/5
2019-02-19 14:00:46.842852: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA

60000/60000 [==============================] - 4s 65us/step - loss: 0.4995 - acc: 0.8246
Epoch 2/5
60000/60000 [==============================] - 4s 62us/step - loss: 0.3734 - acc: 0.8655
Epoch 3/5
60000/60000 [==============================] - 4s 63us/step - loss: 0.3346 - acc: 0.8788
Epoch 4/5
60000/60000 [==============================] - 4s 63us/step - loss: 0.3102 - acc: 0.8861
Epoch 5/5
60000/60000 [==============================] - 4s 63us/step - loss: 0.2918 - acc: 0.8916

10000/10000 [==============================] - 0s 36us/step           

(後期注釋:預測出來的精确度)

Test accuracy: 0.8514

(後期注釋:選第一個樣本進行預測,并對比實際的結果)

9
9           

2.1總結一下使用TensorFlow的步驟

  1. 加載資料:使用dataset的api加載資料,并将資料集分成訓練資料和測試資料
  2. 檢查資料:檢查dataSet的資料有沒有問題(例如,樣本的記錄數、label的記錄數等)
  3. 對資料預處理:對測試資料和訓練資料進行歸一化處理,目的:減少因為數值的大小所帶來的影響(一般我們會将值都縮小在一個小的範圍内)
  4. 建立神經網絡:(輸入層、隐藏層、輸出層)
  5. 為模型定義損失函數、優化器、名額
  6. 将訓練資料丢進我們的神經網絡中,生成出Model
  7. 将測試資料丢進我們生成好的Model進行評估,預測出我們的準确率

三、TensorFlow介紹

3.1什麼是TensorFlow

如果去Google搜關鍵字“TensorFlow”,那可能你會看到這麼一句話:

An open source machine learning framework for everyone.

沒錯,TensorFlow就是一個機器學習的架構。至于架構,相信大家也比較好了解了;類比到Java,比如說我們的Spring架構給我們封裝了好多好用的API,簡化我們的開發(想想當年寫Servlet的時候!)

TensorFlow作為機器學習的架構,同樣也給我們封裝了好多好用的API,能夠降低學習機器學習的門檻。

  • 就拿上面的例子來說,沒想到那麼少的代碼就可以跑機器學習的“HelloWorld”了!

至于機器學習和神經網絡的相關基礎,我強烈建議讀讀這兩篇文章!通俗易懂的科普文章:

3.2TensorFlow的架構

我們可以發現上面的Demo所用的基礎語言是Python,但不要認為TensorFlow就是Python的一個架構。我看到過一個比喻,覺得寫得挺好的,粘貼一下:

Python 和 Tensorflow 之間的聯系,可以類比 Javascript 和 HTML 之間的關系。Javascript 是一種全功能的程式設計語言,可以實作各種出色的效果。HTML 是用于表示某種類型的實用計算抽象(這裡指的是可由 Web 浏覽器呈現的内容)的架構。Javascript 在互動式網頁中的作用是組裝浏覽器看到的 HTML 對象,然後在需要時通過将其更新為新的 HTML 來與其互動。

下面再來看看TensorFlow的架構圖(Python隻是對TensorFlow進行了封裝)

從零開始學TensorFlow

TensorFlow的引擎也是分了很多子產品的(這裡我們簡單了解一下):

從零開始學TensorFlow

最後

總結一下這篇文章:

  • 安裝TensorFlow必要的環境
  • 跟着官方文檔,體驗一下TensorFlow(機器學習)的“HelloWorld”
    • 根據給出的例子,猜出使用TensorFlow(機器學習)時需要做哪些步驟
  • TensorFlow就是一個機器學習(深度學習)的架構,提供了很多實用的API友善我們去玩機器學習(深度學習)。

相信看到這裡,很多人都跟我之前一樣,一臉懵逼。對官方給出的例子中的API不熟悉,去查閱相關資料的時候又發現有好多機器學習相關的術語,對這些術語又不了解。然後就循環懵逼..

while(true){
    // 循環懵逼..
}
           

其實回想剛學Java的時候,也是這麼一個過程,當你從螢幕看到“HelloWorld”了以後,大機率來說也是不了解相關的API具體做了什麼事(甚至連API都不知道是啥意思)。但花一段時間去學習了以後,就會發現,原來HelloWorld是真的簡單!

public static void main(String[] args) {

    System.out.println("Hello World");

}
           

後續我會繼續更新我學習TensorFlow時的一些筆記,有興趣的小夥伴不妨跟着我一起學習~

另外,從文章的開頭我也已經說了,我對Python、機器學習都是沒有相關基礎的,如果有寫錯的地方不妨在評論區留言指正。

原文位址

https://www.cnblogs.com/Java3y/p/10500623.html