2022年3月6日 星期日

在Windows 上安裝 python + Tensorflow + keras

※ 前言

    開始在 Windows 安裝一些人工智慧與機器學習的套件的時候才發現會踩到的坑坑洞洞
竟然不比Linux少啊… 不過對於一些對 Linux 有適應不良的使用者來說,
在Windows上作業還是比較簡單,底下和大家分享
『沒有GPU的一般使用者』如何在 Windows 下安裝 python + Tensorflow + keras
並在本機 cnn 跑一個簡單的手寫數字辨識

先到 tensorflow 的官網
https://www.tensorflow.org/install/source_windows


綜合網路的相關文章可以發現windows + python平台若想安裝tensorflow有三種方式:

   法1.在 Windows 上從原始碼開始建構 whl檔 (python + visual studio...)

   法2.找到已經編譯好的 whl 檔 ,直接安裝

   法3.Anaconda治百病


自行建構whl檔不容易,但Anaconda有時有太過於肥大,
在這裡和大家分享法2 

※ Step0. 系統及軟體版本需求:

  1.     Tensorflow 2.6.2 : 

 官網上說 tensorflow 2.6.2 支援 python3.6~3.9 
 而且在網路上找不到 x86的 whl 檔,因此
 windows 和 python必須是64位元的版本
     Tensorflow whl檔載點:
Note:
  位元版本錯誤時有可能會得到下列訊息
  DLL Load Failed: %1 is not a valid win32 application

 2.    Windows 64bit :

    在這裡我使用 Win10
     這裡要特別更新一下 Tensorflow 需要的 Microsoft c + + (MSVC)
     [後面會再提到…]
     
https://docs.microsoft.com/zh-tw/cpp/windows/latest-supported-vc-redist?view=msvc-170
     

 3.    python 64bit : 

   在這裡我使用 python3.6  , 因為我有時會用到 dlib ,
     但找不到dilb for python3.7以上的whl檔
      python for windows 載點:

   後記:
    2022/10/4
       找到 dlib for python3.7 的載點如下
       https://github.com/sachadee/Dlib
    
       比起dlib,發現 mediapipe 更好用,看了一下pipy上有支援到python3.7

   對有sence滴朋友來說,看到這裡應該就可以自己去Try了…

4.    keras:

     Tensorflow 2.x 以上會自帶 keras , 這裡我用的是 keras 2.6.0

5.    Python IDE 的選擇:

      a. Thonny :輕溥短小
      b. IDLE一樣而言安裝 python 時它會自帶 IDLE ,大家可能會忽略這一點
          IDLE 其實也蠻好用的
      c. Jupyter notebook:要搭配安裝 ipykernel  才能順利切換python的 kernel
      d. Anconda : 用Anaconda的話應該可以不用煩惱安裝元件的事…
      ....

     有鑑於大家使用的IDE不盡相同,本篇文章的處理原則如下:

         i.   直接由原始python的資料夾搭配『命令提示字元』(cmd.exe) 視窗操作

         ii.  安裝 python 及其它套件時全部使用預設資料夾
              (一般使用者,不用最高權限)

     PS: 安裝tensorflow,IDE要搭配哪一個版本的 python應該都是可以做選擇的
     不管使用哪一種 IDE ,一定要先知道:

          i.   python的版本
          ii.  python.exe 所在資料夾
          iii. 在IDE中如何切換各版本之python資料夾(或如何建python虛擬環境)

※Step1. 安裝 python 3.6   64bit


下載網址:

選擇 install now  , 特別要記得底下顯示的 python安裝路徑,我這裡是

C:\Users\infor\AppData\Local\Programs\Python\Python36

info 是我的windows使用者名稱,大家可置換成自己的windows使用者名稱,建議將windows使用者名報改成簡潔的英文,中間不要有空格,這樣在後續安裝和操作上都可以省去很多麻煩

安裝好 python 之後可先開好 pip.exe 資料夾
C:\Users\infor\AppData\Local\Programs\Python\Python36\Scripts



一些安裝包的whl檔就可以丟進來,方便之後使用 pip install 進行安裝

※ Step2. 安裝 Tensorflow 2.6.2

 1.下載 Tensorflow 2.6.2   並放入 pip.exe所在資料夾

 Tensorflow whl檔載點:
     
這裡選擇 2.6.2 (載點)來做示範,大家可以根據自己電腦的環境需求找適合的whl檔
在python安裝包中 cp36 一般代表 python3.6 ,win 代表windows系統,x86一般為32位元,而amd64則代表64位元,筆者大都會根據需求下關鍵字google是否有 whl 的載點…

下載好的 .whl 檔放置到本次安裝的python版本之 pip.exe 所在資料夾:
 C:\Users\infor\AppData\Local\Programs\Python\Python36\Scripts
(紅字部分自行填入windows使用者名稱)


2.開啟cmd.exe (於左下角 windows 搜尋列輸入 cmd 即可找到)


3.切換資料夾到 pip.exe 所在位置

輸入指令:

cd  C:\Users\infor\AppData\Local\Programs\Python\Python36\Scripts



4.輸入指令,設定 PATH 環境變數

set PATH=" C:\Users\infor\AppData\Local\Programs\Python\Python36"

   未設定PATH變數時,後續安裝會產生Warning

5.輸入安裝tensorflow指令:

pip install tensorflow-2.6.2-cp36-cp36m-win_amd64.whl

Note: 『tensorflow-2.6.2-cp36-cp36m-win_amd64.whl 』這個檔案已經在資料夾內部了,只要輸入『ten』後再按 tab 鍵就會自動完成
這裡因為是從全新的 python3.6 環境 安裝 tensorflow , 會花一些時間下載安裝相關的套件,安裝進行時如果有報錯就需要再針對錯誤訊息檢視是哪一個環節出問題,
成功安裝結束之後會看到 Successfully installed .... 等字眼


至此 tensorflow 已成功安裝,接下來跑一下CNN圖片識別的範例程式。

Note:
    1.若出現下列錯誤訊息

       failed to load the native tensorflow runtime.

         可能要更新一下MSVC後再重新安裝,連結如下:
     
     2. 可以透過底下指令更新 tensorflow版本
pip install --upgrade tensorflow

※ Step3. 執行CNN手寫圖片辨識範例(待補上)


※ 使用 python IDLE 撰寫程式
    windows左下視窗搜尋 IDLE (選擇python3.6 64bit IDLE)
     快速鍵 ctrl + N 可開啟新檔案      
Note: 若使用mnist資料集下載需要一些時間,這裡使用我寫的手寫數字的小資料集『Data_HandWrite』(含手寫資料產生程式)
   https://www.youtube.com/watch?v=zXANs6mJe5U

import Data_HandWrite
Data_HandWrite.downloadData()
X_train,Y_train = Data_HandWrite.LoadData('train')
X_test,Y_test = Data_HandWrite.LoadData('test')

import os
from keras.models import Sequential, load_model
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPool2D
from keras.utils import np_utils #, plot_model
from keras.datasets import mnist
import matplotlib.pyplot as plt
import numpy as np

'''
①.將資料調整為二維圖片集合[圖片數,長,寬,RGB 3維]
方便輸入至 CNN (捲積神經網路)
②.Y 標籤轉換為 one-hot 方式
'''
x_train = X_train.reshape(-128283)
x_test = X_test.reshape(-128283)
y_train = np_utils.to_categorical(Y_train)
y_test = np_utils.to_categorical(Y_test)

import numpy as np
from matplotlib import pyplot
x = np.reshape(X_train,(-1,28,28,3))
for i in range(3):
  print(Y_train[i])
  pyplot.imshow(x[i]);pyplot.show()
  
'''
建構網路並規劃各層架構
捲積層1==>Max-pool(降低採樣)==>捲積層2==>Max-pool(降低採樣)==>Dropout==>
平坦層==>隱藏層==>輸出層
'''
model = Sequential() 
# Create CN layer 1  
model.add(Conv2D(filters=2,kernel_size=(3,3),padding='same',  
              input_shape=(28,28,3),  
              activation='relu'))  
# Create Max-Pool 1  
model.add(MaxPool2D(pool_size=(2,2)))  

# Create CN layer 2 
model.add(Conv2D(filters=4,kernel_size=(2,2),  
        padding='same',activation='relu'))  
# Create Max-Pool 2 
model.add(MaxPool2D(pool_size=(2,2)))  
# Add Dropout layer  
model.add(Dropout(0.25))  
# 建立平坦層 
model.add(Flatten()) 
# 建立隱藏層 
model.add(Dense(128, activation='relu'))  
model.add(Dropout(0.5))
# 建立輸出層 
model.add(Dense(6, activation='softmax'))  
print(model.summary())


# 訓練
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
'''
全資料集訓練 50 回合(epochs)
1回合共 640 張訓練圖片
1批次訓練64張圖片(batch_size)==>共訓練10批次
'''
model.fit(x_train, y_train, epochs=10, batch_size=64, verbose=1)

# 測試
loss, accuracy = model.evaluate(x_test, y_test)
print('Test:')
print('Loss: %s\nAccuracy: %s' % (loss, accuracy))