Posted on

使用GPU跑tensorflow的除錯流程

最簡單的範例

這邊的程式碼是官網教學裡的一個簡單範例:
https://www.tensorflow.org/tutorials/keras/classification?hl=zh-tw

# TensorFlow and tf.keras
import tensorflow as tf

# Helper libraries
import numpy as np
import matplotlib.pyplot as plt

print(tf.__version__)
fashion_mnist = tf.keras.datasets.fashion_mnist

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

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10)
])

train_images_tensor = tf.convert_to_tensor(train_images, dtype=tf.float32)
train_labels_tensor = tf.convert_to_tensor(train_labels, dtype=tf.int64)

# Create a dataset from tensors
train_ds = tf.data.Dataset.from_tensor_slices((train_images_tensor, train_labels_tensor))

AUTOTUNE = tf.data.AUTOTUNE

def configure_for_performance(ds):
    ds = ds.cache()
    ds = ds.shuffle(buffer_size=1000)
    ds = ds.batch(32)
    ds = ds.prefetch(buffer_size=AUTOTUNE)
    return ds


train_ds = configure_for_performance(train_ds)

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
import time
timestamp = time.strftime("%Y-%m-%d_%H-%M-%S")
print(timestamp)
model.fit(
    train_ds,
    epochs=5, batch_size=32
)
timestamp = time.strftime("%Y-%m-%d_%H-%M-%S")
print(timestamp)
test_loss, test_acc = model.evaluate(test_images,  test_labels, verbose=2)

print('\nTest accuracy:', test_acc)

# 作出預測
probability_model = tf.keras.Sequential([model,
                                         tf.keras.layers.Softmax()])
predictions = probability_model.predict(test_images)
print(predictions[0], test_labels[0])

使用GPU建模

經過了前三章的教學之後,應該已經設定好了Tensorflow的GPU環境
1. 在python裡面使用GPU 1 – 選擇適合的GPU
2. 在python裡面使用GPU 2 – 安裝正確的套件
3. 在python裡面使用GPU 3 – 開發GPU程式
接著就要嘗試使用GPU來建模,並評估和原本的效能有多大差異,現在就可以將上面的程式碼COPY下來,然後在有GPU的環境嚇跑看看

TensorFlow版本過舊的錯誤

AttributeError: module 'tensorflow.python.util.dispatch' has no attribute 'add_fallback_dispatch_list'

這個錯誤通常是因為您正在使用舊版本的 TensorFlow,而該版本中沒有 dispatch 模塊的 add_fallback_dispatch_list 屬性。

要解決此問題,建議您更新 TensorFlow 到最新版本。您可以使用 pip 升級 TensorFlow:

pip install --upgrade tensorflow

如果正在使用 GPU 版本的 TensorFlow,請使用 tensorflow-gpu 套件升級:

pip install --upgrade tensorflow-gpu

CUDA版本過舊

2023-01-03 14:34:18.036663: W tensorflow/stream_executor/gpu/asm_compiler.cc:111] *** WARNING *** You are using ptxas 11.0.194, which is older than 11.1. ptxas before 11.1 is known to miscompile XLA code, leading to
incorrect results or invalid-address errors.

You may not need to update to CUDA 11.1; cherry-picking the ptxas binary is often sufficient.
這個警告指出正在使用舊版本的 ptxas 編譯器,並表示它可能會導致 XLA 代碼的錯誤編譯,產生不正確的結果或無效地址錯誤。

要解決此問題,建議更新 ptxas 編譯器到最新版本。升級到 CUDA 11.1,或者選擇性地選擇更新 ptxas 編譯器。

可以在 NVIDIA 網站上下載最新版本的 CUDA Toolkit:
https://developer.nvidia.com/cuda-toolkit

zlibwapi.dll找不到

Could not locate zlibwapi.dll. Please make sure it is in your library path!

這個錯誤指出找不到 zlibwapi.dll 文件。這通常是因為您的系統中沒有安裝 zlib 庫。

要解決此問題,建議您安裝 zlib 庫。您可以在此頁面下載 zlib 庫:
https://www.zlib.net/

下載並安裝 zlib 庫後,請將 zlibwapi.dll 文件放在您的系統路徑中。通常,您可以將 zlibwapi.dll 文件放在 C:\Windows\System32 目錄中。

zlibwapi.dll版本錯誤

Could not load library zlibwapi.dll. Error code 193. Please verify that the library is built correctly for your processor architecture (32-bit, 64-bit)

這個錯誤指出無法載入 zlibwapi.dll 文件,並提示錯誤代碼 193。通常是因為您的系統和 zlibwapi.dll 文件的類型不匹配,例如您的系統是 64 位,而 zlibwapi.dll 文件是 32 位。
請參考此文章:https://blog.csdn.net/qq_45071353/article/details/124091856
最後我改下載x64的zlib(下載點)

成功使用GPU跑TF的訊息

2023-01-03 17:05:21.826122: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1616]
Created device /job:localhost/replica:0/task:0/device:GPU:0 with 3971 MB memory:  ->
device: 0, name: NVIDIA GeForce GTX 1660 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5
Posted on

讓OpenCV支持GPU

OpenCV CUDA

https://opencv.org/platforms/cuda/

現代 GPU 加速器已經變得強大且功能強大,足以執行通用計算 (GPGPU)。這是一個發展非常迅速的領域,引起了開發計算密集型應用程序的科學家、研究人員和工程師的極大興趣。儘管在 GPU 上重新實現算法存在困難,但許多人這樣做是為了檢查它們的速度。為了支持這些努力,許多高級語言和工具已經可用,例如 CUDA、OpenCL、C++ AMP、調試器、分析器等。

計算機視覺的重要組成部分是圖像處理,這是圖形加速器最初設計的領域。其他部分也假定大規模並行計算並且通常自然映射到 GPU 架構。因此,實現所有這些優勢並在圖形處理器上加速 OpenCV 具有挑戰性,但非常有益。

目標

  • 在 GPU 上為開發者提供方便的計算機視覺框架,與當前 CPU 功能保持概念上的一致性。
  • 使用 GPU 實現最佳性能(針對現代架構調整的高效內核、優化的數據流,如異步執行、複製重疊、零複製)
  • 完整性(盡可能多地實施,即使加速不是很好;這樣可以完全在 GPU 上運行算法並節省應對開銷)

表現

使用範例

這兩個都是載入圖片的方法,上面的是載至CPU,而下方則是載至GPU
img_Mat = cv2.imread(‘test.jpg’) # 16-bit float, OpenCV GPU版本安裝教學

請見此篇: https://cloud.tencent.com/developer/article/1722771

所需套件如下:
1. nVidia 驅動程式和cuDNN
2. Cmake:cmake-3.20.0-rc3-windows-x86_64.msi(用來重新編譯支援GPU的OpenCV)
3. OpenCV 4.51:opencv-4.5.1.tar.gz
4. OpenCV_contrib 4.5.1:opencv_contrib-4.5.1.tar.gz

Posted on 1 Comment

在python裡面使用GPU 3 – 開發GPU程式

GPU運算與CPU運算的不同

下面是GPU 和CPU 之間的一些主要區別:

  • 運算單元:GPU 通常具有數百甚至數千個運算單元,而CPU 通常只有幾十個運算單元。
  • 並行運算能力:由於GPU 具有更多的運算單元,它能夠同時處理更多的數據,因此在並行運算方面具有優勢。
  • 計算能力:在單位時間內,GPU 的計算能力通常要高於CPU。
  • 功耗:由於GPU 具有更多的運算單元,它的功耗通常比CPU 高。
  • 用途:GPU 專門用於圖形處理,通常用於遊戲、視頻播放和圖形設計等任務。而CPU 則是計算機的中央處理器,負責處理各種計算任務。

指定使用的GPU

在程式中使用 GPU 時,需要在執行模型訓練或推理時將運算放在 GPU 上。您可以使用 TensorFlow 的 tf.device 函數指定運算的裝置。例如,您可以將運算放在第一個可用的 GPU 上:

with tf.device('/gpu:0'):
  # 在這裡放置您的運算
  pass

此外,可能需要注意 GPU 記憶體使用量。當您的模型變得越大,可能需要更多的 GPU 記憶體。可以使用 TensorFlow 的 tf.config.experimental.set_virtual_device_configuration 函數設定虛擬裝置配置以指定可用 GPU 的記憶體數量。

開發GPU程式

對開發人員而言,最大的不同就是,GPU運算會需要將資料在入GPU裡面,而當資料在GPU裡面時,我們並沒有辦法直接像當資料在CPU裡面時一樣,可以很方便的使用print來查看裡面的內容。
也因此,針對支援GPU的陣列運算庫,我們可以發現,通常在做陣列運算時,會呼叫相關的方法去做運算,如:

另外在載入資料時,也要注意使用既有可使用GPU載入資料的函數載入資料至正確的GPU上面(例如 tf.data),避免資料頻繁地在GPU和CPU之內轉換

避免資料頻繁地在GPU和CPU之內轉換

要避免資料頻繁地在 GPU 和 CPU 之間轉換,可以考慮以下幾點:

  • 將資料放在 GPU 上:使用 tf.device 函數指定資料所在的裝置。
  • 將運算和資料放在同一個 GPU 上:這樣可以避免資料在 GPU 和 CPU 之間頻繁轉換。
  • 使用高效的數據讀取方式:使用 TensorFlow 的數據讀取功能(例如 tf.data)可以更有效地讀取和轉換數據,並減少磁盤 I/O 的負擔。

更高效的使用GPU

  • 將運算放在 GPU 上:使用 tf.device 函數指定運算的裝置。
  • 設定虛擬裝置配置:使用 tf.config.experimental.set_virtual_device_configuration 函數指定可用 GPU 的記憶體數量。
  • 使用數據平行:將模型的數據分成多個 batch 並同時在多個 GPU 上訓練,可以提升訓練速度。您可以使用 TensorFlow 的 tf.distribute.Strategy API 來實現數據平行。
  • 調整 batch size:適當調整 batch size 可以平衡訓練速度和 GPU 記憶體使用量。

在tensorflow裡面自動最佳化使用GPU

TensorFlow 可以自動偵測可用的 GPU,並將運算自動分配到 GPU 上。要讓 TensorFlow 自動最佳化使用 GPU,您需要:

安裝 NVIDIA 驅動程式和 CUDA Toolkit。
安裝 GPU 版本的 TensorFlow。
在安裝 NVIDIA 驅動程式和 CUDA Toolkit 時,請確保安裝適用於您的 GPU 的版本。您可以在 NVIDIA 網站上查看可用驅動程式的列表。

安裝 GPU 版本的 TensorFlow 時,您需要使用 tensorflow-gpu 套件。您可以使用 pip 安裝:

pip install tensorflow-gpu

安裝完成後,TensorFlow 就會自動偵測可用的 GPU,並將運算自動分配到 GPU 上。您不需要在程式中手動指定運算的裝置。

注意:如果您的系統中沒有可用的 GPU,TensorFlow 會使用 CPU。

Posted on

機器學習所需的前置知識

前置知識介紹

學習機器學習的前置知識包括:

  • 數學基礎:學習機器學習需要具備良好的數學基礎,尤其是線性代數、微積分和概率論的基礎知識。
  • 編程基礎:學習機器學習需要具備編程能力,至少應該熟悉一種編程語言,如 Python、C++ 或 Java。
  • 算法基礎:了解常用的算法和數據結構,如排序算法、搜索算法、哈希表和二叉樹,將有助於學習機器學習中的算法。
  • 機器學習基礎:了解機器學習的基本概念,如訓練集、測試集、模型和過擬合,有助於加深對機器學習的理解。
  • 心理學基礎:了解心理學基礎知識,如信息加工理論和注意力機制,可以幫助我們更好地理解機器學習的應用。

當然,機器學習是一門涉及多個領域的學科,學習時可能還需要具備其他領域的知識,如統計學、計算機科學和人工智能等。

此外,學習機器學習時還需要具備一定的學習能力和探究精神,能夠獨立思考問題並尋找解決方案。建議您先了解機器學習的基本概念,並通過實踐來加深理解。可以嘗試解決一些練手的機器學習問題,或者參加一些在線的機器學習課程或比賽,來提升自己的機器學習能力。

微積分

微積分是計算數學的一個分支,主要研究連續的函數的求積、導數、極限的概念。在機器學習中,微積分的概念有助於我們理解和掌握梯度下降 (gradient descent) 算法,以及訓練神經網路的過程。

線性代數

線性代數是計算數學的一個分支,主要研究向量和矩陣的概念。在機器學習中,線性代數的概念有助於我們理解和掌握神經網路的運算過程,以及從數據中學習到有用信息的方法。

在線性代數中,還有許多其他概念,例如:

  • 線性相關:多個向量是線性相關的,當且僅當它們可以由其他向量的線性組合表示。
  • 基:向量空間的基是一组向量,它们的线性组合可以表示向量空间中的任何向量。
  • 秩:向量空間的秩是指最多可以由多少个向量的线性无关组合表示出来。
  • 線性無關:多個向量是線性無關的,當且僅當它們不能由其他向量的線性組合表示。
  • 內積:向量的內積是指兩個向量的點積,可以用來度量兩個向量之間的夾角。
  • 特徵向量:特徵向量是指線性轉換的特徵

信息加工理論和注意力機制

信息加工理論是心理學中一種用於描述人類心理信息加工過程的理論。它描述了人類大腦如何接收、處理、儲存和使用信息的過程。

根據信息加工理論,人類的大腦有三個基本的信息加工系統:感覺系統、認知系統和記憶系統。感覺系統負責接收外界信息,如視覺、聽覺、觸覺等,並將這些信息轉化成電信號傳遞給認知系統。認知系統負責對接收到的信息進行分析、比較、推理和決策,並將結果轉化成電信號傳遞給記憶系統。記憶系統負責存儲信息,並在需要時將信息重新取出。

注意力機制是指人類大腦如何選擇哪些信息應該被注意,哪些信息應該被忽略的過程。注意力是人類大腦加工信息的一種重要機制,它可以幫助我們過濾掉不重要的信息,專注於重要的信息。注意力可以由內部因素 (如情緒、動機和目標) 和外部因素 (如視覺、聽覺和触覺信息) 共同影響。

注意力機制在機器學習中也有重要作用。例如,在解決複雜的機器學習問題時,我們可能會面臨大量的信息和訓練數據,這時候需要注意力機制來幫助我們把重點放在最重要的信息和數據上。此外,注意力機制還可以用於解決模型過擬合問題,即讓模型更加關注訓練數據中的重要信息,而忽略噪聲和不重要的信息。

在機器學習中,注意力機制通常是通過注意力機制層 (attention layer) 實現的。注意力機制層是一種神經網絡層,它可以根據輸入數據的不同特徵,動態地分配注意力,從而更加精確地提取重要信息。注意力機制層已廣泛應用於機器翻譯、自然語言處理和計算機視覺等領域。

Posted on 1 Comment

在python裡面使用GPU 2 – 安裝正確的套件

前置作業

使用 GPU 來加速 Python 程式的運算需要:

  • 電腦必須要有適合的 GPU 及相關驅動程式。
  • 必須安裝支援 GPU 的 Python 程式庫,例如 TensorFlow、PyTorch 或 CuPy。
  • 在使用這些程式庫時將運算指定給 GPU 執行

安裝Tensorflow GPU版本的函式庫

在上面幾步驟都安裝好之後,要確認自己所使用的函式庫是支援GPU的,一般來說,所有的函式庫都會分為【支持GPU版本】或者【針對CPU版本】。
所以要先確定自己所下載的函式庫是支持GPU的。如果你的環境之前已經安裝過CPU版本的該函式庫,建議新增另一個虛擬環境,讓新專案的函式庫能夠完全與CPU版本的程式分開
這邊是使用pip安裝tensorflow套件的流程:https://www.tensorflow.org/install/pip?hl=zh-tw
在最下方有一個列表https://www.tensorflow.org/install/pip?hl=zh-tw#package-location

若是想要直接確定要下載的版本,可從上面的列表下載.whl檔案,然後用以下指令套用

pip install tensorflow-apu-0.0.1-cp36-cp36m-linux_x86_64.whl

檢查有沒有Tensorflow 可用的GPU

可使用下面的程式來檢查

import tensorflow as tf
print("TensorFlow version:", tf.__version__)

print("Is there a GPU available: "),
print(tf.config.list_physical_devices("GPU"))

print("Is the Tensor on GPU #0:  "),
print(x.device.endswith('GPU:0'))

要注意的是,即使你的GPU和驅動程式都正確,但若是安裝到錯誤的函式庫版本(如CPU版本的tensorflow)
這邊仍然會顯示沒有可以使用的GPU

因此,要確認所安裝的函式庫版本是否正確

檢查並設定使用GPU

要在 TensorFlow 中使用 GPU,你需要先檢查有沒有可用的 GPU,並設定 TensorFlow 使用 GPU:

import tensorflow as tf

# 檢查有沒有可用的 GPU
print(tf.config.list_physical_devices('GPU'))

# 設定 TensorFlow 使用 GPU
tf.config.set_visible_devices(tf.config.list_physical_devices('GPU')[0], 'GPU')

要在 PyTorch 中使用 GPU,你可以使用 torch.cuda.is_available() 來檢查有沒有可用的 GPU,並使用 .to(‘cuda’) 將張量放到 GPU 上運算:

import torch

# 檢查有沒有可用的 GPU
print(torch.cuda.is_available())

# 將張量放到 GPU 上運算
x = torch.ones((2, 2), device='cuda')
print(x)

在 CuPy 中使用 GPU 也類似,你可以使用 cp.cuda.Device().id 來檢查有沒有可用的 GPU,並使用 .to_gpu() 將陣列放到 GPU 上運算:

import cupy as cp

# 檢查有沒有可用的 GPU
print(cp.cuda.Device().id)

# 將陣列放到 GPU 上運算
x = cp.ones((2, 2))
x = x.to_gpu()
print(x)
Posted on 1 Comment

在python裡面使用GPU 1 – 選擇適合的GPU

選擇適用的GPU

在python裡面要使用GPU做運算,需要去呼叫GPU操作的方法來操作目標對象。

所以,能不能支持GPU運算,和套件本身有沒有開發針對該GPU操作的模組版本,是最為相關的。
對於python常用的模組,最廣泛有提供GPU操作版本的是針對nVidia裡的CUDA 深度神經網絡 (cuDNN) – cuDNN庫的支持。

nVidia cuDNN介紹

以下為官網的介紹

NVIDIA CUDA® 深度神經網絡庫 (cuDNN) 是一個 GPU 加速的深度神經網絡原語庫。cuDNN 為標準例程提供高度調整的實現,例如前向和反向卷積、池化、歸一化和激活層。

全球的深度學習研究人員和框架開發人員都依賴 cuDNN 來實現高性能 GPU 加速。它使他們能夠專注於訓練神經網絡和開發軟件應用程序,而不是將時間花在低級 GPU 性能調整上。
cuDNN 可加速廣泛使用的深度學習框架,包括Caffe2ChainerKerasMATLABMxNetPaddlePaddlePyTorchTensorFlow。要訪問已將 cuDNN 集成到框架中的 NVIDIA 優化深度學習框架容器,請訪問NVIDIA GPU CLOUD以了解更多信息並開始使用。

另外,因為原本的numpy並不支持GPU,因此有提供了Cupy,其接口高度雷同於numpy
在大多數情況下,它可以用作直接替代品。要做的只是在您的 Python 代碼中用CuPy換numpy。
例如:

import cupy as cp
x = cp.arange(6).reshape(2, 3).astype('f')

cupy官網: https://cupy.dev/

Intel® Distribution for Python*

有少數的模組也有提供支持Intel的另一個GPU操作函式庫,如: NumPy, SciPy, and Numba

選擇適合的GPU

若希望能夠使用GPU來支持python,最重要的就是先確認你要使用哪一些函式庫,然後去尋找該函式庫所支持的GPU版本
但是以一般來說,大多都是會選用nVidia的cuDNN來做GPU版本的開發,因為他所支持的函式庫最為完整,即便numpy並不支持,也都有其他開發者開發出相似功能的函式庫作為取代

以下為cuDNN的相關介紹:https://developer.nvidia.com/cudnn

cuDNN的軟體需求

您的系統上必須安裝下列 NVIDIA® 軟體:

更多資訊請見:https://www.tensorflow.org/install/gpu?hl=zh-tw#hardware_requirements

安裝細節教學請見:https://ithelp.ithome.com.tw/articles/10249572

Posted on 1 Comment

使用conda管理python版本和函式庫

在CMD裡面使用conda

指出 Windows 命令提示符無法識別 conda 命令。這通常是因為您的系統沒有安裝 Anaconda 或 Miniconda 環境管理器,或者沒有將 Anaconda 或 Miniconda 的安裝路徑添加到系統的環境變量中。

將 Anaconda 的安裝路徑添加到系統的環境變量中

如果您的系統上沒有安裝,請前往 Anaconda 網站下載並安裝最新版本:
https://www.anaconda.com/products/individual

錯誤訊息:’conda’ is not recognized as the name of a cmdlet

安裝完成後,若我們在下conda指令時出現如下錯誤

conda : The term 'conda' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try
again.
At line:1 char:1


請打開命令提示符,輸入以下命令更新環境變量:

conda init

即可在該環境下使用conda指令

創建虛擬環境

創建環境:

conda create --name myenv

使用特定版本的 Python 創建環境:

conda create -n myenv python=3.9

使用特定版本的 Python 和多個包創建環境:

conda create -n myenv python=3.9 scipy=0.17.3 astroid babel

從 environment.yml 文件創建環境

使用終端或 Anaconda Prompt 執行以下步驟:

1. 創建environment.yml

pip freeze > environment.yml

2. 從environment.yml文件創建環境:

pip install -r environment.yml

下面是兩個environment.yml的範例
EXAMPLE 1: 簡單的設定範本

name: stats
dependencies:
  - numpy
  - pandas

EXAMPLE 2: 較複雜的設定範本

name: stats2
channels:
  - javascript
dependencies:
  - python=3.9
  - bokeh=2.4.2
  - numpy=1.21.*
  - nodejs=16.13.*
  - flask
  - pip
  - pip:
    - Flask-Testing


2. 啟動新創建的環境:

conda activate myenv

3. 驗證新環境是否安裝正確:

conda env list


也可以使用.conda info --envs

指定環境的位置

以下命令將在當前工作目錄的子目錄中創建一個名為envs的新環境:

conda create --prefix ./envs jupyterlab=3.2 matplotlib=3.5 numpy=1.21


上面的指令同時會建立jupyterlab=3.2 matplotlib=3.5 numpy=1.21為預設的package

匯出現在專案所使用的環境

1. 檢視規格列表,例如:

conda list --explicit

# This file may be used to create an environment using:<br># $ conda create –name &amp;lt;env&amp;gt; –file &amp;lt;this file&amp;gt;<br># platform: osx-64<br>@EXPLICIT<br>https://repo.anaconda.com/pkgs/free/osx-64/mkl-11.3.3-0.tar.bz2<br>https://repo.anaconda.com/pkgs/free/osx-64/numpy-1.11.1-py35_0.tar.bz2<br>https://repo.anaconda.com/pkgs/free/osx-64/openssl-1.0.2h-1.tar.bz2<br>https://repo.anaconda.com/pkgs/free/osx-64/pip-8.1.2-py35_0.tar.bz2<br>https://repo.anaconda.com/pkgs/free/osx-64/python-3.5.2-0.tar.bz2<br>https://repo.anaconda.com/pkgs/free/osx-64/readline-6.2-2.tar.bz2<br>https://repo.anaconda.com/pkgs/free/osx-64/setuptools-25.1.6-py35_0.tar.bz2<br>https://repo.anaconda.com/pkgs/free/osx-64/sqlite-3.13.0-0.tar.bz2<br>https://repo.anaconda.com/pkgs/free/osx-64/tk-8.5.18-0.tar.bz2<br>https://repo.anaconda.com/pkgs/free/osx-64/wheel-0.29.0-py35_0.tar.bz2<br>https://repo.anaconda.com/pkgs/free/osx-64/xz-5.2.2-0.tar.bz2<br>https://repo.anaconda.com/pkgs/free/osx-64/zlib-1.2.8-3.tar.bz2

2. 創建規格列表文件

conda list --explicit &amp;amp;amp;gt; spec-file.txt

匯入已設定好的規格

要使用 spec 文件在同一台機器或另一台機器上創建相同的環境:

conda create --name myenv --file spec-file.txt


要使用 spec 文件將其列出的包安裝到現有環境中:

conda install --name myenv --file spec-file.txt

移除conda環境

使用下列指令

conda env remove -n ENV_NAME

Posted on

了解python載入模組的位置

載入模組方式

一般來說,我們在專案裡面會使用import來載入現有模組

import cv2

了解會從哪些路徑載入-在command line內

1.取得global的site-packages路徑
python –m site

2.取得該使用者的library路徑(per-user)
python -m site –user-site

了解會從哪些路徑載入-在Python程式碼內

那麼,這個cv2的預設位置在哪邊呢?會從哪裡載入呢?
想要了解這個問題,可以在py檔案裏面使用下列程式碼來印出會再入的library位置

import sys
from os.path import dirname
print(sys.path)


可使用site.getsitepackages()或site.getusersitepackages()來了解現在會載入的函式庫位置

import sys, site
site.getsitepackages()
site.getsitepackages()

自行增加載入模組路徑

若想要自行增加模組的位置,則使用

sys.path.append(dirname(__file__))

上面程式碼代表會增加尋找位於dirname(__file__)的檔案

設定要載入的函式庫的路徑位置

有以下三種方法

  • 添加環境變量PYTHONPATH,python會添加此路徑下的模塊,在.bash_profile文件中添加如下類似行: export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python2.7/site-packages
  • site-packages路徑下添加一個路徑配置文件,文件的擴展名為.pth,內容為要添加的路徑即可
  • sys.path.append()函數添加搜索路徑,參數值即為要添加的路徑。

關於第二個點的介紹,請見此篇文章:https://www.itread01.com/qiqiq.html

可以先用上面的語法來尋找可能的函式庫搜尋路徑位置設定檔案的地方,找看看在上面的site-packages的資料夾裡面是否有任何的.pth檔案
一般來說,這個檔案會位於site-packages裡面,如:C:\Python39\Lib\site-packages

使用.pth設定在入路徑

或者可以直接在python的根目錄下增加python39._pth這個檔案
然後直接在檔案裏面增加要載入的路徑即可
裡面內容直接填上路徑即可,以下為一個簡單的python39._pth內容範例

放在與python.exe同一目錄

Posted on

深度學習模型-MLP、CNN與 RNN

常見的深度學習模型

三種深度學習模型,包含:
• MIP:多層感知器( Multilayer Perceptron)
• CNN :卷積神經網路(Convolutional Neural Network )
• RNN:循環神經網路(Recurrent Neural Netw ork)

MLP、CNN與RNN的差異

多層感知器(簡稱 MLP)就是一個全連接網路。在某些文獻裡,它被稱為深度前饋(feedforward)網路或前饋神經網路。從目標應用來認識這些網路有助於我們理解這些進階深度學習模型的設計原理。MIP 常用於簡易的算術與線性迴歸問題。不過,MLP 在處理順序型與多維度資料樣式上的效能不是太好。它在先天設計上很難去記得順序型資料的樣式,並且需要相當大量的參數才能處理多維度資料。

RNN 很常用於順序型的輸入資料,因為其內部設計能讓網路去發掘歷史資料的相依性,這對於預測來說相當有用。

而對於圖片或影片這類多維度資料,CNN 在擷取用於分類、分割、生成或其他目的特徵圖都相當不錯。在某些狀況下,型態為1D卷積的 CNN 也可用於能接受順序型輸入資料的網路。然而在多數深度學習模型中,會把 MLP、RNN 與CNN 結合起來讓它們發揮各自所長。

MLP、CNN與RNN輸入的模型維度

在將資料傳入模型前會需根據模型類型來調整形狀

Keras把 MLP 層稱為 Dense,代表密集連接層。第一與第二MLP 層完全相同,各有256個單元,接著,是relu觸發與 dropout。之所以選用256單元是因為 128、512與 1,024 單元的效能較差。網路在128 單元時會很快收斂,但測試準確度也較低。
而把單元數拉高到 512 或1,024 並不會大幅提升測試準確度。

單元數量稱為超參數 (hyperparameter),它控制了網路的容量(capacity)。容量是指網路可模擬出的函數複雜度。例如對於多項式來說,超參數就是其次方數。只要次方數增加,函數容量也會增加。
如以下模型,在此使用Keras 的Sequential Model API 來實作一個分類器模型。
當模型只需要一個輸入、一個輸出,且只需要由順序排列層來處理時,這樣已經很足夠。

由於 Dense 層屬於線性操作,所以就算有一連串的 Dense 層也只能做到模擬線性函數。現在的問題在於 MNIST 數字分類在本質上就是非線性過程。在Dense層之間插入relu觸發可讓MLP 得以針對非線性應對來建模。relu 或稱為修正線性單元(Rectified Linear Unit, ReIU)是一種簡易的非線性函數,它很像是個過濾器,只讓正值輸入通過且保持不變,其他則全部變為零。數學上來說,relu可用以下方程式來表示

正規化

神經網路傾向於記住自身的訓練資料,尤其是當容量充足的時候。在這樣的狀況下,網路碰到測試資料時就會一塌糊塗。這就是網路無法一般化的典型症狀。模型會運用正規化層或正規化函數來避免這個傾向,常見的正規化層也稱為 dropout。

dropout 的概念很簡單。指定 dropout 率(在此設定 dropout=0.45)・Dropout
層就會隨機移除這個比例的單元數,不讓它們參與下一層・例如,第一層有256個
單元,隨後應用 dropout=0.45。這樣一來,層1就只會有 (1 – 0.45) * 256 units =
140個單元會參與層 2。

常見給神經網路選擇的觸發函數

輸出層的觸發函數選擇

1inear、sigmoid 與 tanh・linear 觸發的是 identity 函數,它就是把輸入複製到輸出而已。sigmoid函數也稱為logistic sigmoid,它可用於預測 tensor 的元素須獨立映射到 0.0與1.0之間的情形。預測tensor 所有的元素總和不需要為1.0,這是與softmax 最大的不同。例如,sigmoid可用於情緒預測(0.0為差,1.0為優)的最後一層,或影像產生(0.0為0,1.0則為255 像素值)。

tanh 函數可將其輸入映射到-1.0到1.0之間,這個性質在輸出值需要有正負值時尤其重要。tanh 函數常用於循環神經網路的內部層,但也可用於輸出層觸發。如果用tanh 來取代輸出觸發中的sigmoid,那麼資料就需要先適當縮放才行。

Posted on

使用GrabCut抓取前景

理論

GrabCut 算法由英國劍橋微軟研究院的 Carsten Rother、Vladimir Kolmogorov 和 Andrew Blake 設計。在他們的論文“GrabCut”:使用迭代圖切割的交互式前景提取中。需要一種算法來以最少的用戶交互進行前景提取,結果就是 GrabCut。

從用戶的角度來看它是如何工作的?最初用戶在前景區域周圍繪製一個矩形(前景區域應該完全在矩形內)。然後算法迭代地對其進行分段以獲得最佳結果。完畢。但在某些情況下,分割效果不佳,例如,它可能將一些前景區域標記為背景,反之亦然。在這種情況下,用戶需要進行精細的修飾。只需在有錯誤結果的圖像上畫一些筆劃即可。Strokes 基本上說 *“嘿,這個區域應該是前景,你將它標記為背景,在下一次迭代中更正它”* 或者它的反面是背景。然後在下一次迭代中,你會得到更好的結果。

請參見下圖。第一個球員和足球被包圍在一個藍色矩形中。然後進行一些帶有白色筆觸(表示前景)和黑色筆觸(表示背景)的最終潤色。我們得到了一個不錯的結果。

函數介紹

grabCut()

下面介紹幾個常用的參數:

  • img – 輸入圖像
  • mask – 這是一個蒙版圖像,我們在其中指定哪些區域是背景、前景或可能的背景/前景等。它由以下標誌完成,cv.GC_BGD、cv.GC_FGD、cv.GC_PR_BGD、cv.GC_PR_FGD,或者簡單地通過0,1,2,3 到圖像。
  • rect – 它是包含格式為 (x,y,w,h) 的前景對象的矩形的坐標
  • bdgModel、fgdModel – 這些是算法內部使用的數組。您只需創建兩個大小為 (1,65) 的 np.float64 類型零數組。
  • iterCount – 算法應該運行的迭代次數。
  • model- 它應該是cv.GC_INIT_WITH_RECT或cv.GC_INIT_WITH_MASK或組合決定我們是繪製矩形還是最終的修飾筆劃。

簡單範例

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('image.jpg')
mask = np.zeros(img.shape[:2],np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect = (50,50,450,290)
cv.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask2[:,:,np.newaxis]
plt.imshow(img),plt.colorbar(),plt.show()
# newmask是我手動標註的mask圖片
newmask = cv.imread('newmask.png',0)
# 標記為白色的地方(當然是前景),更改 mask=1
# 標記為黑色的地方(確定背景),更改 mask=0
mask[newmask == 0] = 0
mask[newmask == 255] = 1
mask, bgdModel, fgdModel = cv.grabCut(img,mask,None,bgdModel,fgdModel,5,cv.GC_INIT_WITH_MASK)
mask = np.where((mask==2)|(mask==0),0,1).astype('uint8')
img = img*mask[:,:,np.newaxis]
cv.imshow("img",img)
plt.imshow(img),plt.colorbar(),plt.show()

結果