Posted on

TensorFlow目標檢測API – 程式使用範例

事前作業

先在這一篇選定想要使用的模型,然後下載後解壓縮在專案的資料夾內,然後參考這篇文章設定環境: TensorFlow 的目標檢測API – 設定環境

程式實作範例

這個範例需要一個攝影機,使用的是SSD MobileNet V2 FPNLite 640×640的預設資料集

import numpy as np
import tensorflow as tf
import VideoStream
import cv2

from object_detection.utils import label_map_util

# 載入模型
PATH_TO_SAVED_MODEL = "./ssd_mobilenet/saved_model"
# 載入模型
detect_fn = tf.saved_model.load(PATH_TO_SAVED_MODEL)

# 載入標籤
PATH_TO_LABELS = './models/research/object_detection/data/mscoco_label_map.pbtxt'
category_index = label_map_util.create_category_index_from_labelmap(PATH_TO_LABELS, use_display_name=True)

import time

# 設定攝影機
videostream = VideoStream.VideoStream((1920, 1080), 30, 0).start()
cam_quit = 0
while cam_quit == 0:
    imageSource = videostream.read()
    smallImg = cv2.resize(imageSource, (1920//5, 1080//5))
    input_tensor = np.expand_dims(smallImg, 0)
    start_time = time.time()
    detections = detect_fn(input_tensor)
    end_time = time.time()
    num_detections = int(detections.pop('num_detections'))
    elapsed_time = end_time - start_time
    print('Done! Took {} seconds'.format(elapsed_time))
    detections = {key: value[0, :num_detections].numpy()
                  for key, value in detections.items()}
    for detection_boxes, detection_classes, detection_scores in \
            zip(detections['detection_boxes'], detections['detection_classes'], detections['detection_scores']):
        if detection_scores > 0.3:
            y_min_pixel = int(detection_boxes[0] * 1080)
            x_min_pixel = int(detection_boxes[1] * 1920)
            y_max_pixel = int(detection_boxes[2] * 1080)
            x_max_pixel = int(detection_boxes[3] * 1920)
            cv2.rectangle(imageSource, (x_min_pixel, y_min_pixel), (x_max_pixel, y_max_pixel), (255, 0, 0), 2)
    cv2.imshow('frame', imageSource)
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        cam_quit = 1

cv2.destroyAllWindows()
videostream.stop()

執行的速度很不錯,一秒可以有25FPS,適合用於實時串流

執行的畫面如下,因為懶惰所以還沒有把標記的label標上去,若想要標記,可直接使用detections['detection_classes']作為分類的index,從category_index去取分類名稱

Posted on

TensorFlow目標檢測API – 功能介紹

YOLO並沒有含在TF2內建的Object Detection API

TensorFlow Object Detection API 提供了在COCO 2017 數據集上預訓練的檢測模型集合 。有多種類型的模型,包括 CenterNet,EfficientDet,SSD,Faster R-CNN 和 Mask R-CNN 等。

每個模型都有其特點:

  • CenterNet:是一種基於關鍵點檢測的目標檢測算法,它使用特定的關鍵點(例如物體的中心點)進行檢測,可以用於處理各種大小的物體,並且可以輸出更豐富的目標信息(如姿態,關鍵點等)。
  • EfficientDet:是一種基於 EfficientNet 和 BiFPN 的目標檢測算法,其優點在於精度高並且效率也相當高,模型大小和計算量都相對較小。
  • SSD (Single Shot MultiBox Detector):是一種用於實時目標檢測的算法,其特點是速度快,適用於需要實時響應的情況。
  • Faster R-CNN:是一種基於區域提議網絡(RPN)的目標檢測算法,其精度很高,但速度相對較慢。
  • Mask R-CNN:是一種擴展了 Faster R-CNN,能進行實例分割(Instance Segmentation)的算法,即除了檢測目標之外,還可以輸出目標的像素級別的掩碼。

然而,YOLO (You Only Look Once) 並沒有在這個列表中。 YOLO 是一種非常流行的實時目標檢測系統,以其快速和精確而著名。 YOLO 的預訓練模型並不在 TensorFlow Hub 提供,但你可以在 YOLO 的官方網站或者 Github 倉庫找到相關的預訓練模型和代碼(https://github.com/yyccR/yolov5_in_tf2_keras)。

如果你有特定的需求,例如對速度,精度,或者是特定類型的任務(例如實例分割或者姿態估計)有特殊的需求,可根據這些需求來選擇合適的模型。目前YOLO在PyTorch的支持進度比較快,到筆者這篇文章時,TF2對YOLO的支持只到yolov5。

包含的物件檢測模型列表

在這邊Speed越低代表速度越快,因為目標網址的CORSS DOMAIN的問題,要下載會需要按右鍵儲存網址然後到新視窗貼上才可以下載

Model nameSpeed (ms)COCO mAPOutputs
CenterNet HourGlass104 512×5127041.9Boxes
CenterNet HourGlass104 Keypoints 512×5127640.0/61.4Boxes/Keypoints
CenterNet HourGlass104 1024×102419744.5Boxes
CenterNet HourGlass104 Keypoints 1024×102421142.8/64.5Boxes/Keypoints
CenterNet Resnet50 V1 FPN 512×5122731.2Boxes
CenterNet Resnet50 V1 FPN Keypoints 512×5123029.3/50.7Boxes/Keypoints
CenterNet Resnet101 V1 FPN 512×5123434.2Boxes
CenterNet Resnet50 V2 512×5122729.5Boxes
CenterNet Resnet50 V2 Keypoints 512×5123027.6/48.2Boxes/Keypoints
CenterNet MobileNetV2 FPN 512×512623.4Boxes
CenterNet MobileNetV2 FPN Keypoints 512×512641.7Keypoints
EfficientDet D0 512×5123933.6Boxes
EfficientDet D1 640×6405438.4Boxes
EfficientDet D2 768×7686741.8Boxes
EfficientDet D3 896×8969545.4Boxes
EfficientDet D4 1024×102413348.5Boxes
EfficientDet D5 1280×128022249.7Boxes
EfficientDet D6 1280×128026850.5Boxes
EfficientDet D7 1536×153632551.2Boxes
SSD MobileNet v2 320×3201920.2Boxes
SSD MobileNet V1 FPN 640×6404829.1Boxes
SSD MobileNet V2 FPNLite 320×3202222.2Boxes
SSD MobileNet V2 FPNLite 640×6403928.2Boxes
SSD ResNet50 V1 FPN 640×640 (RetinaNet50)4634.3Boxes
SSD ResNet50 V1 FPN 1024×1024 (RetinaNet50)8738.3Boxes
SSD ResNet101 V1 FPN 640×640 (RetinaNet101)5735.6Boxes
SSD ResNet101 V1 FPN 1024×1024 (RetinaNet101)10439.5Boxes
SSD ResNet152 V1 FPN 640×640 (RetinaNet152)8035.4Boxes
SSD ResNet152 V1 FPN 1024×1024 (RetinaNet152)11139.6Boxes
Faster R-CNN ResNet50 V1 640×6405329.3Boxes
Faster R-CNN ResNet50 V1 1024×10246531.0Boxes
Faster R-CNN ResNet50 V1 800×13336531.6Boxes
Faster R-CNN ResNet101 V1 640×6405531.8Boxes
Faster R-CNN ResNet101 V1 1024×10247237.1Boxes
Faster R-CNN ResNet101 V1 800×13337736.6Boxes
Faster R-CNN ResNet152 V1 640×6406432.4Boxes
Faster R-CNN ResNet152 V1 1024×10248537.6Boxes
Faster R-CNN ResNet152 V1 800×133310137.4Boxes
Faster R-CNN Inception ResNet V2 640×64020637.7Boxes
Faster R-CNN Inception ResNet V2 1024×102423638.7Boxes
Mask R-CNN Inception ResNet V2 1024×102430139.0/34.6Boxes/Masks
ExtremeNet (deprecated)Boxes
ExtremeNetBoxes

我所選擇的模型

以我的需求而言,我會需要偵測即時串流內的物件,因此需要高速的演算法,我選擇了SSD,官方API內也包含了多個不同的SSD變種和不同的基礎模型(例如 MobileNet 和 ResNet)。這些模型的主要區別在於其複雜性、精度和運行速度:

  1. MobileNet 是一種針對移動和嵌入式設備設計的輕量級深度卷積神經網絡。相比於 ResNet,MobileNet 通常具有更少的參數和計算量,從而在設備上運行速度更快,但可能在精度上稍遜一籌。 MobileNet 的版本 V1 和 V2 是其結構上的不同版本,V2 通常在性能上優於 V1。
  2. FPN (Feature Pyramid Network) 是一種目標檢測模型中常用的模塊,它能幫助模型更好地處理不同尺度的物體。使用了 FPN 的模型通常在處理小物體上有更好的表現。 FPNlite 是 FPN 的一個更輕量級的版本。
  3. ResNet (Residual Network) 是一種深度卷積神經網絡,相比於 MobileNet,ResNet 的模型更深,參數和計算量更大,但在精度上通常更好。 ResNet 的版本(例如 ResNet50, ResNet101, ResNet152)指的是網絡的深度,數字越大,模型越深,通常精度越高,但計算量也越大。
  4. RetinaNet 是一種目標檢測模型,它是基於 FPN 和 ResNet 的一種網絡,其特點是使用了一種新的損失函數(Focal Loss)來解決類別不平衡的問題,對於包含大量背景和少量物體的圖像有很好的性能。

最後我決定使用SSD MobileNet V2 FPNLite 640x640

使用預訓練的物件偵測模型

SSD MobileNet V2 FPNLite 640x640在這邊下載: http://download.tensorflow.org/models/object_detection/tf2/20200711/ssd_mobilenet_v2_fpnlite_640x640_coco17_tpu-8.tar.gz

解壓縮後可以看到以下檔案

  1. pipeline.config: 此文件包含了模型訓練過程中所有的配置參數,包括使用的模型類型(例如 Faster R-CNN,SSD 等),輸入圖像的大小,學習率,批量大小等。當您選擇一個預訓練模型進行微調(fine-tuning)時,這個 pipeline.config 文件通常會包含在下載的模型文件夾中。
  2. checkpoint: 此文件(或者一組文件)保存了模型的權重。在訓練過程中,TensorFlow 會定期保存模型的權重到 checkpoint 文件中,以便在訓練中斷後可以恢復訓練,或者在訓練結束後使用訓練好的模型進行預測。
  3. saved_model裡面是saved_model.pb 文件,這個文件包含了模型的結構和參數。

下面的方法可以用saved_model.pb產生checkpoint

import tensorflow as tf
from tensorflow.python.framework import graph_io
from tensorflow.python.tools import freeze_graph
from tensorflow.tools.graph_transforms import TransformGraph

# 載入模型
loaded = tf.saved_model.load(PATH_TO_SAVED_MODEL)

# 將模型的權重保存為 checkpoint
ckpt = tf.train.Checkpoint(model=loaded)
ckpt.save(PATH_TO_CKPT)

Posted on

TensorFlow 目標檢測API – 設定環境

相關教學資源

在Python安裝object_detection

我是在Windows的環境做開發,而官網的教學的環境是Linux,所以相關工具的安裝有花了一些時間,在這邊分享一下我的安裝方式

以下為Linux環境的工具安裝指令

sudo apt install -y protobuf-compiler
cd models/research/
protoc object_detection/protos/*.proto --python_out=.
cp object_detection/packages/tf2/setup.py .
python -m pip install .

大概就是要安裝protobuf,接著下載TensorFlows Model,然後把model放到你要呼叫Object Detection的程式目錄的下方 ,在這邊我執行python -m pip install .時,會一直出現如下錯誤

ERROR: Could not build wheels for opencv-python, which is required to install pyproject.toml-based projects

查了一下網路文章,大概猜到是python版本和opencv版本還有tensorflow版本有所不合,所以到官方網站看一下安裝所需要的環境需求如下,不同版本的Tensorflow所要搭配使用的OpenCV、Python的版本都不同:

最後我是使用python3.7的環境,才成功的安裝好object_detection

conda create -n object_detection python=3.7.16
conda activate object_detection
cd models/research/
python -m pip install .

安裝protobuf工具

在 Windows 上,可以通過以下步驟安裝 protobuf 編譯器:

  • 下載安裝包: 訪問 protobuf 的 GitHub Release 頁面(https://github.com/protocolbuffers/protobuf/releases),找到適用於 Windows 的預編譯二進製文件(例如 protoc-3.x.x-win64.zip)並下載到本地。
  • 解壓縮文件: 將下載的 zip 文件解壓縮到你想要安裝的位置,例如解壓縮到 C:\protobuf 文件夾。
  • 設置環境變量: 將解壓縮後的 bin 文件夾路徑添加到系統的環境變量中,這樣系統就能在任意位置找到 protoc 命令。
  • 驗證安裝: 打開命令提示符視窗,運行protoc --version,檢查 protoc 是否成功安裝。

安裝完成之後,就可以在./models/research下面執行

protoc object_detection/protos/*.proto --python_out=.

接著就可以用下面指令進行測試

python object_detection/builders/model_builder_tf2_test.py

如果沒有把*.proto編譯成.py,在執行物件偵測的程式碼時會出現以下錯誤

from object_detection.protos import string_int_label_map_pb2

ImportError: cannot import name ‘string_int_label_map_pb2

其他遇到的錯誤

DLL載入錯誤

import _ssl # if we can’t import it, let the error propagate

ImportError: DLL load failed: The specified module could not be found.

討論串: Python 3.7 anaconda environment – import _ssl DLL load fail error

解法: From anaconda3\Library\bin copy below files and paste them in anaconda3/DLLs:

setup.cfg指令過期錯誤

site-packages\setuptools\config\setupcfg.py:293: _DeprecatedConfig: Deprecated config in `setup.cfg`

AttributeError: module ‘os’ has no attribute ‘add_dll_directory’

解法: python環境和套件之間版本不合,重新檢查套件版本是否符合官網要求

以下為我最終使用的環境的套件版本清單:

Posted on

人工智慧之於微軟的想法

對AI產業趨勢的觀查

微軟台灣區總經理卞志祥是財務工程和電腦工程的跨界,從新創到外商這樣走,因此他就是擅長電腦工程和產業的分析。他說『很少看到一個科技,是短短三到六個月之間從談論到變成每一個公司廣泛被討論的一個課題,尤其是在企業高層的廣泛討論』

產業的領導者很專注於這一個產業的變革,討論的主題不是技術而是商業模式,所以過去六個月就是不斷的和產業先進去學習一些DOMAIN KNOW HOW

2023年是一個高度不確定性的年代,也就是在這樣的年代之中,危機同時也就會帶有轉機,因為在每一次在全球地緣邊境的變動,會創造出很多變動中產出的WINNER和LOSER。例如:賽車時,要在大晴天之中想要在落後的前提下,超越很多專業車手,是非常困難的,而在大雨天才很有可能有這樣的機會。

產業改變得非常非常的快,並且驅動這個轉型的原因變得非常非常的多元,適應改變的速度會是未來決定一切非常重要的關鍵點

AI核心能力

  1. 摘要生成(Summary Generation):AI能夠通過自然語言處理和機器學習技術,從文本中提取關鍵信息並生成簡潔的摘要。這項技術對於處理大量文本數據、提供快速概覽和自動化報告具有重要意義。
  2. 網絡聲量的正負評判斷(Sentiment Analysis of Web Volumes):AI能夠分析網絡上的大量文本數據,並判斷其中的情感傾向,例如正向、負向或中性。這對於企業監測品牌聲譽、分析消費者反饋等具有價值。
  3. 文章意圖情緒判斷(Intent and Emotion Analysis of Articles):AI可以分析文章的內容,並判斷其中的意圖和情緒。這有助於理解作者的目的和觀點,以及文章所傳達的情感色彩,從而提供更深入的理解和洞察。

高度賦能員工,改變與客戶互動的方式,優化流程。做的到這三件事情就有可能去實現你產品的新的機會

BING和CHATGPT的不同

CHATGPT是一個已建模完成的模型,且其資料停在2021年

BING會有一個關鍵字前處理的狀況,會先去網路找相關資料,然後會把資料輸入模型去產生結果,也因為這樣,Bing會有較高的正確性,因為在前處理的部份的搜尋動作,可以增加回應的正確性。

ChatGPT模型架構

CHATGPT在其內部架構中使用了Embedding model。Embedding model在CHATGPT中用於將輸入文本轉換為連續向量表示,以便進一步處理和生成回應。

在CHATGPT中,文本序列首先被轉換為一系列的詞嵌入(Word Embeddings),詞嵌入是將單詞映射為連續向量表示的技術。這些詞嵌入向量在模型內部被用作輸入特徵,以捕捉單詞的語義和上下文信息。通過使用詞嵌入,CHATGPT可以將輸入文本轉換為數字化的連續向量表示,以供模型進一步處理。

Embedding model在CHATGPT中的使用有助於提取和表示輸入文本的含義和特徵,並為模型提供適當的表徵。這樣,模型可以更好地理解和生成合適的回應。

不過CHATGPT不僅僅依賴於Embedding model,它是基於Transformer架構的深度學習模型。Transformer模型的主要組件包括多層的自注意力機制和前饋神經網絡,以實現高效的序列建模和生成。

Embedding model的後續能力很強,因為這些連續向量表示可以應用於多種機器學習和深度學習任務中,提供了強大的特徵表達能力。

Embedding model的後續能力包括:

  1. 特徵提取:Embedding model可以將複雜的原始數據轉換為低維度的連續向量表示,這些向量表示可以作為特徵用於後續的機器學習任務,如分類、回歸、聚類等。
  2. 相似性計算:Embedding model可以捕捉數據之間的相似性和關聯性,從而可以應用於計算數據之間的相似度或距離。這對於搜索引擎、推薦系統和相似度匹配等應用非常有用。
  3. 聚類和分群:Embedding model可以將數據映射到連續向量空間中,從而使得相似的數據點在向量空間中更加接近。這使得聚類和分群變得更加容易,可以幫助我們識別和組織數據的結構。
  4. 可視化和理解:Embedding model可以將高維度的數據轉換為低維度的連續向量表示,這使得數據可以在二維或三維空間中可視化。這有助於我們理解數據之間的關係和結構。

強大的後續可能性

插件(Plugin)對AI系統可以產生後續更重大的影響力,並擴展其功能和應用領域。插件可以添加到AI系統中,以提供額外的功能、數據源或服務,從而影響整個AI生態系統。

在AI生成和對話方面,外掛插件可以引入特定領域的知識、資源或服務,從而使AI系統能夠處理更廣泛的任務和應用場景。舉例來說,對於旅行規劃,像AGADA這樣的插件可以提供訂房服務,使AI能夠直接與酒店預訂業務進行對話和交互。這樣的插件擴展了AI系統的能力,使其能夠在旅遊領域提供更全面的服務。

對於像CHATGPT或Copilot這樣的AI系統,外掛的成熟度對其功能和效能起著重要作用。成熟的外掛插件可以提供更多的選項和集成,使AI系統能夠與更多的業務單位或服務進行交互,從而增強其應用價值和實用性。

插件的開發和整合需要技術和商業合作,以確保外掛能夠無縫地集成到AI系統中。對於外掛插件的成熟度和支持,開發者和業務單位可以根據其需求和目標來選擇適合的外掛,以擴展AI系統的能力和功能。

 Microsoft 365 Copilot即為一種後續應用

相關資訊: 重塑未來工作樣貌:微軟推出 Microsoft 365 Copilot,工作上的最佳 AI 助手

看到真的是瞠目結舌….

Posted on

人工智慧概論

人工智慧的演進

  • 符號邏輯(1950-1960): 一種基於數學邏輯的形式化推理方法。符號邏輯可以用於推理、定理證明和形式化知識表示等領域。然而,符號邏輯在處理不確定性和模糊性方面存在困難,並且對於現實世界中複雜的問題可能不夠靈活。
  • 專家系統(1980-1990): 一種基於知識表示和推理的AI系統。它借助專家的知識和經驗來解決特定領域的問題。專家系統將專家知識編碼為規則、條件和結論的形式,並使用推理引擎來解釋和應用這些規則。專家系統在早期的AI研究中得到了廣泛應用,特別是在診斷、監控和決策支持等領域。然而,專家系統的主要限制在於對知識的表達和推理能力受限,且對於知識的獲取和維護需要大量的專家參與。
  • 機器學習(2010-Present): 隨著AI的發展,新的技術和方法不斷涌現,如機器學習、深度學習和統計方法,這些方法更加強調從數據中學習和模式識別,並能夠處理現實世界中的複雜問題。

讓機器自己從圖片中尋找差異

博藍尼悖論(Polanyi’s Paradox)認為人類能表達的,遠比人類所知道的少

莫拉維克悖論(Moravec’s Paradox): 對於機器而言,人類的直覺,遠比人類的推理來的複雜 (更多運算資源)

讓電腦自己學習

從規則驅動變成資料驅動,只是原本是人從資料去定義規則,現在則是由電腦來找到規則

為了讓電腦更有效率地找到規則並在提取特徵之後辨識物體,可以採取以下方法:

  1. 架構化資料:確保找到的東西具有一定的結構和組織。這包括在數據中添加元數據、標籤或層次結構,以便電腦能夠更容易地理解和處理這些資料。例如,在圖像識別中,可以添加標籤、分類和層次結構,以區分不同的物體和屬性。
  2. 特徵提取和描述:利用機器學習和計算機視覺技術來提取物體的特徵。CNN(卷積神經網絡)是一種常用的技術,可以從圖像中提取特徵。這些特徵可以包括顏色、紋理、形狀、邊緣等。通過提取特徵,電腦可以將複雜的資料轉化為可計算的形式,並進一步進行辨識和分類。
  3. 模式識別和機器學習:利用模式識別和機器學習算法,讓電腦能夠學習從提取的特徵中辨識物體。這包括監督式學習和無監督式學習等方法。透過建立模型並訓練它們使用大量的樣本資料,電腦可以學習如何從特徵中識別和分類物體。
  4. 多模態學習:結合不同模態的資訊,例如視覺、聲音、質地等,以提高辨識的準確性和鮮度。這涉及到整合不同感測器或多種資料源的資訊,並設計適當的模型和算法來處理這些多模態資訊。

應用範例

糖尿病的視網膜病變

https://www.kaggle.com/datasets/eishkaran/diabetes-using-retinopathy-prediction

魔術橡皮擦,可以自動去把相片的很多背景雜物移除

https://www.kaggle.com/datasets/utkarshsaxenadn/human-body-background-remover

利用Diffusion實現圖像生成

https://www.kaggle.com/datasets/dschettler8845/diffusiondb-2m-part-0001-to-0100-of-2000

機器學習的流程

4D Process包括Define Problem, Data Collect, Develop Model, Deploy Model

  1. 定義問題:這是解決問題的起點。在這一步中,我們明確定義問題的目標和範圍,確定我們想要解決的具體問題。這包括確定問題的背景、目標、限制條件和預期的結果。在這個階段,我們也需要了解問題的相關方面,與利益相關者進行溝通,以明確問題的需求和期望。
  2. 數據收集:在這一步中,我們收集和整理與問題相關的數據。數據可能來自不同的來源,如數據庫、日誌文件、傳感器、網絡等。收集到的數據應該具有代表性,且能夠支持模型開發和解決問題的需求。在這個階段,我們也需要進行數據清理和預處理,以確保數據的質量和一致性。
  3. 模型開發:在這一步中,我們根據問題的要求和數據的特性開發相應的模型。這可能涉及選擇和應用適當的機器學習或統計方法,進行模型設計和訓練,並進行評估和優化。模型開發的目標是利用數據來建立一個能夠解決問題、預測結果或提供洞察的模型。
  4. 模型部署:在這一步中,我們將開發好的模型應用到實際環境中,以解決問題或提供服務。這可能包括將模型集成到軟體系統或應用程式中,進行系統測試和驗證,並確保模型在實際場景中的效能和可靠性。模型部署的目標是使模型能夠實際運行並發揮其應用價值
Posted on

AI現況的概觀

人工智慧是第四次的工業革命

Mobile computing, inexpensive sensors collecting terabytes of data, and the rise of machine learning that can use that data will fundamentally change the way the global economy is organized.

Fortune, “CEOs: The Revolution is Coming,” March 2016

移動計算、廉價感測器收集的大量數據以及機器學習的興起將從根本上改變全球經濟的組織方式

移動計算指的是人們使用移動設備(如智能手機、平板電腦)進行計算和資訊處理的能力。隨著移動設備的普及和技術的發展,人們能夠隨時隨地存取資訊和進行各種計算任務,不再受限於固定的位置或時間。這使得商業活動和經濟交易可以更靈活地進行,並且在不同的地點和時間進行交流和合作。

同時,廉價的感測器技術讓我們能夠收集大量的數據。感測器可以應用於各種物理環境,例如工業設備、城市基礎設施、交通系統、健康監測等。這些感測器可以收集和傳輸各種類型的數據,例如溫度、壓力、位置、運動、光線等。由於感測器成本的下降,人們可以以更低的成本部署大量的感測器網絡,從而收集和分析大量的數據。這些數據提供了對於各種系統和環境的詳細洞察,並且為企業和政府制定更有效的決策提供了依據。

同時,機器學習的快速發展使得我們能夠有效地處理和分析這些大量的數據。機器學習是一種人工智慧的分支,它利用數據和算法來使計算機自動學習並提高性能。通過機器學習,我們能夠從數據中發現模式、趨勢和關聯性,並且能夠預測和做出更準確的決策。這對於企業的營銷、客戶服務、生產優化、預測分析等各個領域都具有重要意義。

AI會造成那些變革呢?

在軟體開發中的應用:AI被應用於軟體開發的各個階段和領域。例如,AI可以用於自動化測試和驗證、代碼生成和自動化編程、缺陷檢測和修復、軟體需求分析和優化等。AI的應用可以提高開發效率、減少錯誤和提供更好的軟體品質。

軟體開發人員可以利用現有的AI工具和平台來開發具有智能功能的軟體應用。AI工具和框架的開放性和可用性不斷提高,使得開發人員能夠更容易地整合AI技術到他們的軟體項目中。

軟體定義硬體(Software-Defined Hardware)指的就是利用軟體控制和編程來定義和配置硬體資源。AI的發展促使軟體定義硬體的興起,因為AI需要大量的計算資源和專用硬體來實現高效的運算。軟體定義硬體技術可以通過軟體來定義和配置硬體資源,以適應不同的AI工作負載和需求。

對於不同的應用場景,可以選擇不同的AI算法和技術。例如,時間序列分析可以使用統計方法、機器學習模型或深度學習模型等不同的技術來處理。對於每個應用領域,了解和理解相關的AI技術,並選擇合適的方法和工具是非常重要的。

AI取代的是職能不是產業

晶片技術的進步和創新為人工智慧的發展提供了強大的計算能力和效能提升。

AI將重新定義產業

  • 重新定義員工的技能: 核心技能的重新訓練提升
  • 重新定義部門的功能: 把智能化當成再進化的機會
  • 重新定義組織的效能: 創造進入的門檻與護城河

Al核心技術

機器學習

  • 監督式學習
  • 非監督式學習
  • 模型參數優化

深度學習

  • 卷積神經網路(CNN)
  • 深度神經網路(DNN)
  • 循環神經網路(RNN)
  • 神經網路與網路參數優化

進階學習技術

  • 強化學習(Reinforcement Learning)是一種機器學習的方法,旨在使智能體(agent)通過與環境的交互行為學習最佳的行動策略,以最大化預期的回報(reward)。
  • 遷移式學習(Transfer Learning)旨在將在一個任務或領域上學習到的知識和經驗應用於另一個相關或相似的任務或領域中。它假設前一個任務的學習可以為後續的學習提供有用的信息和特徵。
  • 對抗式學習
  • 聯邦式學習(Federated Learning)通常涉及在多個參與方的本地數據上進行分散訓練,每個參與方使用本地數據訓練局部模型,然後將模型的更新參數聚合到全局模型中。每個參與方可以具有不同的數據分布和特徵,而原始數據通常不共享。

工具框架

  • Al應用開發工具,如: C、Python、JavaScript
  • Al模型開發框架,如: TensorFlow、PyTorch、Keras(可以運行在TensorFlow、PyTorch等後端上)、Scikit-learn
  • Al部署工具與平台: 與傳統程式開發的CI/CD不同之處在於這邊是對AI模型進行版本管理,以便追蹤和管理不同版本的模型,因為模型的更新和改進是一個持續的過程。相比之下,傳統程式開發中的版本管理更偏向於代碼和軟體功能的版本控制。
  • Al系統整合與開發: 將人工智能(AI)技術和解決方案集成到現有的系統或應用程序中,以實現更智能化、自動化或增強的功能

資料治理

  • 資料管理架構
  • 特徵工程
  • 資料品質

AI應用技術

電腦視覺

自然語言處理

  • 情緒分析
  • 語言翻譯
  • 文本分析與生成
  • 社群媒體與社交網路分析
  • 聊天機器人

數據分析與預測

  • 資料建模與調校
  • 數據分析與預測
  • 時間序列分析與預測

語音處理

  • 語音辨識
  • 語音合成
  • 情感分析
  • 語音索引

推薦系統

  • 關聯式推薦(Association-based Recommendation):基於物品之間的關聯性進行推薦。它假設物品之間的關聯性可以用共現或相似性來衡量。例如,如果用戶購買了商品A,則可以通過關聯分析推薦與商品A相關的商品B。
  • 內容推薦(Content-based Recommendation):根據用戶過去的行為和對物品的偏好,推薦與用戶喜好相似的物品。它使用物品的屬性和特徵來建模和描述物品,並基於這些特徵計算用戶的興趣相似度。常見的方法是使用機器學習算法,如TF-IDF(Term Frequency-Inverse Document Frequency)和餘弦相似度來計算相似度並進行推薦。例如,如果用戶喜歡觀看某部電影,則可以根據該電影的特徵和用戶的偏好,推薦與該電影相似的其他電影。
  • 協同過濾推薦(Collaborative Filtering Recommendation):根據用戶的歷史行為和與其他用戶的相似性來進行推薦。它假設具有相似行為模式的用戶會有相似的偏好,並根據這種相似性來推薦物品。協同過濾可以分為基於用戶(User-based)和基於物品(Item-based)的方法。基於用戶的協同過濾將根據其他用戶對物品的評價來推薦物品給目標用戶,而基於物品的協同過濾則根據物品之間的相似度來推薦。
  • 深廣學習推薦系統(Deep Learning Recommendation Systems):深廣學習推薦系統使用深度神經網絡模型來捕捉用戶和物品之間的複雜關係,以提供個性化的推薦。這些模型可以學習到高維度的嵌入式表示,並進一步進行用戶興趣建模和物品推薦。協同過濾推薦系統需要大量的用戶行為數據(如評分或點擊數據),而內容推薦系統需要豐富的物品特徵數據。深廣學習推薦系統則需要用戶行為和物品特徵的結合數據。

新興應用技術

  • Meta 元宇宙涉及虛擬現實技術、3D 建模、社交媒體和區塊鏈等多種技術,AI 在其中扮演著一個重要的角色,用於實現虛擬世界的智能化、自動化和個性化。
  • Web 3.0中包括去中心化、區塊鏈和加密貨幣等技術的應用。AI 在 Web 3.0 中也扮演著重要的角色,特別是在區塊鏈智能合約、數據分析和自動化等方面的應用。AI 技術可以用於分析和處理大量的數據,提供智能合約的自動執行和驗證機制,並改進用戶的互動和體驗。

Al產業應用

智慧製造

  • 產品檢測/瑕疵檢測
  • 規劃排程/自動化流程
  • 設備維護預測
  • 物流整合/庫存管理
  • 自動化機械

智慧醫療

  • 醫學影像與診斷
  • 醫療訊號分析與偵測
  • 病歷報告分析
  • 健檢與輔助醫療照護
  • 預測及風險分析

智慧零售

  • 影像辨識(顧客、商品等)
  • 智能客服
  • 智慧貨架/庫存管理
  • 倉儲與物流管理
  • 顧客分析/需求預測

智慧金融

  • 證件辨識
  • 生物辨識
  • 詐欺洗錢防制AML
  • 最佳投資組合

邊緣運算

一種在邊緣設備或邊緣網路中執行人工智能(AI)任務的計算方式。它將AI的計算和推理能力移到距離數據生成源頭更接近的地方,以減少延遲、節省頻寬並提高效能。

  • 邊緣運算強調將計算資源和AI能力移近到數據生成源頭的重要性,以應對處理大量數據和低延遲要求的應用。生態系則涉及邊緣運算相關的技術、產品和服務提供商,包括硬體設備、軟體平台、開發工具等。
  • 霧運算(Fog Computing)是指在邊緣設備和雲端之間建立的一層中介計算層。它將計算和存儲資源分佈到邊緣網路中,使數據能夠在邊緣設備和雲端之間進行處理和分析。分散式協作架構則關注在邊緣環境中實現多個設備之間的協作和溝通,以實現更複雜的任務和應用。
  • 主流的邊緣計算方案和工具庫提供了在邊緣設備上執行AI任務的技術和工具。這些方案和工具庫通常包括優化的AI模型、運行時環境、軟體開發工具和部署工具等。它們使開發人員能夠將AI能力整合到邊緣設備中,實現本地化的AI處理。
  • 5G和物聯網是邊緣運算的重要驅動力之一。5G技術提供了更高的帶寬、更低的延遲和更多的連接數,為邊緣設備提供了更好的網絡基礎設施。物聯網則提供了大量的感測器和設備,產生了大量的數據,需要在邊緣進行處理和分析。
Posted on

使用Tensorboard來觀察模型效能

Tensorboard介紹

在機器學習中,要改進模型的某些參數,通常需要觀察模型數據以進行衡量。TensorBoard 是用於提供機器學習工作流期間所需測量和呈現的工具。它使您能夠跟踪實驗指標(例如損失和準確率),呈現模型計算圖,將嵌入向量投影到較低維度的空間等。

TensorBoard是TensorFlow的可視化工具,用於可視化和分析機器學習實驗的結果。它提供了一組豐富的可視化面板,可以幫助您理解、調節測試和優化訓練過程中的模型。

主要功能和用途

以下是TensorBoard的一些主要功能和用途:

  1. Scalar Dashboard(標量儀表板):顯示訓練過程中的標量指標,如損失函數、準確率、學習率等。您可以隨時跟踪這些指標間的變化,並比較不同實驗之間的結果。
  2. Graph Dashboard(圖形儀表板):顯示模型的計算圖,可視化網絡結構和層之間的連接。這有助於理解和調試模型的結構,查看各層的輸入輸出形狀。
  3. 直方圖儀表板(直方圖儀表板):顯示權重、加權和激活函數的分配情況。這用於觀察參數隨時間的變化、檢測梯度消失或突然爆炸等問題很有幫助。
  4. Image Dashboard(圖像儀表板):可視化輸入圖像、模型生成的圖像或模型層輸出的特徵圖等。這對於在圖像數據中觀察模型上的表現和理解卷積網絡中的特徵提取過程非常有用。
  5. Embedding Dashboard(嵌入儀表板):用於可視化高維嵌入空間中的數據。您可以在三維空間中探索和比較嵌入向量,以及在嵌入空間中相似的樣本。
  6. Projector Dashboard(投影儀表板):提供了一種交互式的界面,可以在高維空間中對數據進行探索和分析。您可以通過選擇和過濾樣本、聚類分析和降維等操作來理解數據集的結構。

TensorBoard 提供了一種觀察的方式來監視和分析機器學習模型,以了解模型的行為並進行調優。您可以使用 TensorFlow 的相關API(如)將數據寫入TensorBoard日誌文件,然後在命令tf.summary中行中運行 TensorBoard 來查看和分析結果。

如何使用

以下為一個範例程式

import tensorflow as tf
import datetime

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

def create_model():
  return tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation='softmax')
  ])

model = create_model()
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
# 設定log的資料夾
log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
# 設定tensorboard的callback
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)

model.fit(x=x_train, 
          y=y_train, 
          epochs=5, 
          validation_data=(x_test, y_test), 
          callbacks=[tensorboard_callback])

接著就可以在所指定的資料夾位置運行tensorboard介面

tensorboard --logdir logs/fit

接著開啟http://localhost:6006就可以看到如下畫面,這個畫面是Scalars,顯示損失和指標在每個時期如何變化

Graphs用以可視化模型。可以看出你的模型是如何建構的,有用到那些方法

Distributions是顯示張量隨時間的分佈。DistributionsHistograms這兩頁很相似,可了解模型權重隨時間的變化,作為判斷是否出現問題的初步衡量標準。

Histograms是使用Ridgeline plot來顯示張量隨時間的分佈,橫軸為epochs訓練的次數,縱軸則為權重和偏差的值

Time-Seriesscalars非常相似,都是在評估準確度。然而,一個區別是每次訓練迭代而不是每個時期對目標指標的觀察。

Posted on

如何訓練和測試數據

將資料切分

在數據科學中,訓練數據和測試數據扮演著兩個主要的角色。評估已構建模型的性能與訓練和構建模型同樣重要,因為未經評估性能的模型可能會產生錯誤的預測並導致嚴重的並發症。為了防止這種情況發生並確保預測的準確性,您必須足夠好地測試和驗證模型。

為了構建和評估機器學習模型的性能,我們通常將數據集分成兩個不同的數據集。這兩個數據集是訓練數據測試數據

訓練數據測試數據
用於構建模型用於評估構建的模型
分配更大的數據部分分配較小的數據部分
可進一步劃分以進行驗證不會進一步分割

什麼是驗證數據

驗證數據是從訓練數據中分離出來的子數據集,用於在訓練過程中驗證模型。來自驗證過程的信息幫助我們改變模型的參數、分類器以獲得更好的結果。所以基本上,驗證數據可以幫助我們優化模型。 

使用 Scikit-learn 的 train_test_split來切割數據

使用下面這段程式碼可以將訓練及分割成訓練及驗證集

from sklearn.model_selection import train_test_split
# 載入資料集
....
# 分離訓練和測試數據
X_train, X_val, y_train, y_val = train_test_split(train_images_fold, train_labels_fold, test_size=0.1, random_state=42)
model = create_model()
keras_classifier.fit(X_train, y_train, validation_data=(X_val, y_val))

使用測試資料作驗證

下面這段程式可以使用X_test、y_test來使用model做測試,並且可以用accuracy_score來取得準確率,並將準確率存入一個陣列裡

predictions = keras_classifier.predict(X_test)
accuracy = accuracy_score(y_test, predictions)
accuracy_scores.append(accuracy)

若是想要取得錯誤的資料集,則可以用np.where來取得與正確答案不一樣的資料,並將錯誤的資料存入incorrect陣列裡面

incorrect_indices = np.where(predictions != y_test)[0]
incorrect_images = X_test[incorrect_indices]
incorrect_labels = y_test[incorrect_indices]
incorrect_prediction = predictions[incorrect_indices]
for i in range(len(incorrect_indices)):
    incorrect.append({"image": incorrect_images[i] ,"label": incorrect_labels[i], "pred": incorrect_prediction[i], "idx": fold_index})

完整範例

下面的範例為結合K-Fold概念,將資料及分成五份,並做五次的訓練以判別模型的訓練狀況是否有過擬合的狀況。其中會每次會取其4分來做訓練、1份做測試,再將訓練集中的1/10拆做驗證集。最後使用matplotlib.pyplot來顯示這五次之中,測試集中錯誤結果的圖片

import numpy as np
import matplotlib.pyplot as plt
import pathlib
from sklearn.model_selection import StratifiedKFold
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
from tensorflow import keras
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_validate

img_path = 'dice3'

def class_names(path):
    return np.array(sorted([item.name for item in pathlib.Path(path).glob('*') if
                            "LICENSE.txt" != item.name]))
def create_model():
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Rescaling(1. / 255))
    model.add(tf.keras.layers.Conv2D(32, kernel_size=7, activation='relu'))
    model.add(tf.keras.layers.MaxPooling2D())
    model.add(tf.keras.layers.Conv2D(64, kernel_size=5, activation='relu'))
    model.add(tf.keras.layers.MaxPooling2D())
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(64, activation='relu'))
    model.add(tf.keras.layers.Dense(len(class_names(img_path))))

    model.compile(
        optimizer='adam',
        loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
        metrics=['accuracy'])
    return model


train_ds = tf.keras.utils.image_dataset_from_directory(
  img_path,
  seed=7,
  batch_size=32)
train_images = []
train_labels = []

for images, labels in train_ds:
    train_images.append(images.numpy())
    train_labels.append(labels.numpy())

train_images = np.concatenate(train_images, axis=0)
train_labels = np.concatenate(train_labels, axis=0)
label_encoder = LabelEncoder()
train_labels_encoded = label_encoder.fit_transform(train_labels)

# 創建KerasClassifier
keras_classifier = KerasClassifier(build_fn=create_model, epochs=5, batch_size=16)

# 定義StratifiedKFold
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=123)

fold_index = 1
# 進行交叉驗證
accuracy_scores = []
incorrect = []
for train_indices, val_indices in kfold.split(train_images, train_labels_encoded):
    print("fold_index="+str(fold_index))
    train_images_fold = train_images[train_indices]
    train_labels_fold = train_labels_encoded[train_indices]

    X_test = train_images[val_indices]
    y_test = train_labels_encoded[val_indices]
    
    # 分離訓練和測試數據
    X_train, X_val, y_train, y_val = train_test_split(train_images_fold, train_labels_fold, test_size=0.1, random_state=42)
    model = create_model()
    keras_classifier.fit(X_train, y_train, validation_data=(X_val, y_val))

    predictions = keras_classifier.predict(X_test)
    accuracy = accuracy_score(y_test, predictions)
    accuracy_scores.append(accuracy)

    incorrect_indices = np.where(predictions != y_test)[0]
    incorrect_images = X_test[incorrect_indices]
    incorrect_labels = y_test[incorrect_indices]
    incorrect_prediction = predictions[incorrect_indices]
    for i in range(len(incorrect_indices)):
        incorrect.append({"image": incorrect_images[i] ,"label": incorrect_labels[i], "pred": incorrect_prediction[i], "idx": fold_index})
    # 印出準確率
    print("Accuracy scores:", accuracy_scores)
    print("Mean accuracy:", np.mean(accuracy_scores))
    fold_index += 1

# 顯示出錯誤的答案
images_per_page = 15
num_images_per_row = 5
num_images_per_col = 3
        
num_pages = (len(incorrect) - 1) // images_per_page + 1
for page in range(num_pages):
    start_idx = page * images_per_page
    end_idx = (page + 1) * images_per_page
    page_detail = incorrect[start_idx:end_idx]
    
    fig, axes = plt.subplots(num_images_per_col, num_images_per_row, figsize=(num_images_per_col*2, num_images_per_row*2))
    i=0
    for data in page_detail:
        image = data["image"]
        label = data["label"]
        pred = data["pred"]
        idx = data["idx"]
        row = i // num_images_per_row
        col = i % num_images_per_row
        ax = axes[row, col]
        image = image.astype(np.uint8)
        ax.imshow(image)
        ax.set_title(f"{label}->{pred}({idx})")
        i = i+1
        ax.axis("off")

    plt.tight_layout()
    #plt.suptitle("fold_index:"+str(fold_index)+"-"+str(page+1), x=0, y=1, ha='left', va='top')
    plt.show()

參考資料

Posted on

k-Fold Cross-Validation(交叉驗證)

一般所使用的方式 – Holdout method

這是一種非常基本且簡單的方法,我們將整個數據集分為兩部分,即訓練數據測試數據。顧名思義,我們在訓練數據上訓練模型,然後在測試集上進行評估。通常,訓練數據的大小設置為測試數據的兩倍以上,因此數據按70:30或80:20的比例進行分割。

在這種方法中,數據在分割之前首先被隨機洗牌。由於模型是在不同的數據點組合上訓練的,每次訓練時模型都會給出不同的結果,這可能是不穩定的原因。此外,我們永遠無法保證我們選擇的訓練集能夠代表整個數據集。

此外,當我們的數據集不是太大時,測試數據很可能包含一些我們丟失的重要信息,因為我們沒有在測試集上訓練模型。範例程式如下:

import tensorflow as tf
 
# 建立圖片資料集
dataset = tf.keras.utils.image_dataset_from_directory(
    'image_directory',
    labels='inferred',
    class_names=None,
    label_mode='int'
)
 
# 計算資料集的大小
dataset_size = tf.data.experimental.cardinality(dataset).numpy()
 
# 計算訓練集和測試集的大小
test_size = int(0.2 * dataset_size)
train_size = dataset_size - test_size
 
# 將資料集分割為訓練集和測試集
train_dataset = dataset.take(train_size)
test_dataset = dataset.skip(train_size)

改善方法 – k-Fold Cross-Validation

K 折交叉驗證是改進的一種方法。這種方法保證了我們模型的分數不依賴於我們選擇訓練集和測試集的方式。將數據集分為 k 個子集,並將保留方法重複 k 次。讓我們分步驟完成這個過程:

  1. 將整個數據集隨機分成 k 個折疊(子集)
  2. 對於數據集中的每個折疊,在數據集的 k – 1 個折疊上構建模型。然後,測試模型以檢查第 k 次折疊的有效性
  3. 重複此操作,直到每個 k 重都作為測試集
  4. k 記錄的準確度的平均值稱為交叉驗證準確度,並將作為模型的性能指標。

因為它確保來自原始數據集的每個觀察結果都有機會出現在訓練和測試集中,所以與其他方法相比,這種方法通常會產生偏差較小的模型。如果我們的輸入數據有限,這是最好的方法之一。 

這種方法的缺點是訓練算法必須從頭開始重新運行 k 次,這意味著進行評估需要 k 倍的計算量。

分層k-Fold – Stratified K Fold Cross Validation

在分類問題上使用 K Fold 可能會很棘手。由於我們隨機打亂數據,然後將其劃分為折疊,因此我們可能會得到高度不平衡的折疊,這可能會導致我們的訓練出現偏差。例如,讓我們以某種方式得到一個折疊,其中大多數屬於一個類(例如正類),而只有少數屬於負類。這肯定會破壞我們的訓練,為了避免這種情況,我們使用分層進行分層折疊。

分層是重新排列數據的過程,以確保每次折疊都能很好地代表整體。例如,在每個類包含 50% 數據的二元分類問題中,最好對數據進行排列,使得在每個折疊中,每個類包含大約一半的實例。

下面這張圖,是在分類問題上使用K-Fold折疊的方式,會發現因為不同分類隨機分組導致每個分組的數量不一,而破壞訓練的狀況

資料狀況: 共三種資料,每一種70張,共210張,訓練集168張,測試集42張

而改使用StratifiedKFold去做資料分組之後,能看到訓練過程更加順利

範例程式

以下為使用Tensorflow加上sklearn.model_selection去做資料分組的測試程式

import numpy as np
import pathlib
import tensorflow as tf
from sklearn.model_selection import LeaveOneOut,KFold
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import LabelEncoder
from sklearn.datasets import load_iris

img_path = 'dice3'
train_ds = tf.keras.utils.image_dataset_from_directory(
  img_path,
  seed=7,
  batch_size=32)
X = []
y = []

for images, labels in train_ds:
    X.append(images.numpy())
    y.append(labels.numpy())

X = np.concatenate(X, axis=0)
y = np.concatenate(y, axis=0)
label_encoder = LabelEncoder()
y = label_encoder.fit_transform(y)

def class_names(path):
    return np.array(sorted([item.name for item in pathlib.Path(path).glob('*') if
                            "LICENSE.txt" != item.name]))
def create_model():
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Rescaling(1. / 255))
    model.add(tf.keras.layers.Conv2D(32, kernel_size=7, activation='relu'))
    model.add(tf.keras.layers.MaxPooling2D())
    model.add(tf.keras.layers.Conv2D(64, kernel_size=5, activation='relu'))
    model.add(tf.keras.layers.MaxPooling2D())
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(64, activation='relu'))
    model.add(tf.keras.layers.Dense(len(class_names(img_path))))
    model.compile(
        optimizer='adam',
        loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
        metrics=['accuracy'])
    return model

def make_dataset(X_data,y_data,n_splits):
    def gen():
        for train_index, test_index in KFold(n_splits).split(X_data):
            X_train, X_test = X_data[train_index], X_data[test_index]
            y_train, y_test = y_data[train_index], y_data[test_index]
            yield X_train,y_train,X_test,y_test

    return tf.data.Dataset.from_generator(gen, (tf.float64,tf.float64,tf.float64,tf.float64))

dataset=make_dataset(X,y,5)


for X_train,y_train,X_test,y_test in dataset:
    print(len(X_train), len(y_train), len(X_test), len(y_test))
    model = create_model()
    model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_test, y_test))


若要改成使用分層K-Fold,則要使用sklearn.model_selection的StratifiedKFold

def make_dataset(X_data,y_data,n_splits):
    def gen():
        kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=123)
        for train_index, test_index in kfold.split(X_data, y_data):
            X_train, X_test = X_data[train_index], X_data[test_index]
            y_train, y_test = y_data[train_index], y_data[test_index]
            yield X_train,y_train,X_test,y_test

    return tf.data.Dataset.from_generator(gen, (tf.float64,tf.float64,tf.float64,tf.float64))

資料集長這樣

參考資料

Posted on

Optimization loop failed: Cancelled: Operation was cancelled

遇到的錯誤訊息

2023-06-14 16:32:39.652288: W tensorflow/core/data/root_dataset.cc:167] Optimization loop failed: Cancelled: Operation was cancelled

這個錯誤訊息代表TensorFlow 在優化過程中遇到了問題,並且操作被取消了。當操作被取消時,TensorFlow 無法完成所需的計算任務,因此無法產生期望的結果。具體來說,如果你在使用 TensorFlow 的 CPU 模式下運行一個優化循環,並且該循環被取消,以下情況可能發生:

  • 訓練過程中斷:如果你正在訓練一個模型,操作取消將導致訓練過程中止。你將無法完成整個訓練過程,無法獲得最終訓練好的模型。
  • 中斷的結果:在某些情況下,如果操作被取消,TensorFlow 可能會嘗試返回已經計算出的部分結果。這取決於具體的操作和中斷發生的時間點。然而,這些部分結果通常不是完整或不可用的。
  • 推斷錯誤:如果你正在使用模型進行推斷(如輸入一條文本獲取其分類),而操作被取消,你將無法獲得模型對輸入的預測結果。這可能導致你無法得知模型的輸出,或者輸出結果不完整、不准確。

為什麼會出現此錯誤

大部分的狀況是因為資源不足,導致運算被中斷

  • 計算資源不足:TensorFlow 在 CPU 模式下運行時,對於大型、複雜的模型或數據集,可能需要較長的時間來完成計算。如果計算資源有限,操作可能會被取消。
  • 內存不足:TensorFlow 在處理大型模型或數據時需要大量內存。如果內存不足,操作可能會被取消。
  • 配置錯誤:有時,TensorFlow 的配置可能不正確,導致操作無法成功完成。這可能包括錯誤的版本或依賴問題。

觀察電腦CPU與MEMORY使用狀況

要解決此問題,首先要先觀察是哪一部分出了問題,就需要在程式內去監控資源的使用。請參考此篇教學: How to get current CPU and RAM usage in Python

    # Importing the library
    import psutil


    # Getting % usage of virtual_memory ( 3rd field)
    if psutil.virtual_memory()[2] > 80:
        print(time.strftime("%Y-%m-%d_%H-%M-%S") + ' RAM memory % used:', psutil.virtual_memory()[2])
        # Getting usage of virtual_memory in GB ( 4th field)
        print('RAM Used (GB):', psutil.virtual_memory()[3]/1000000000)
    
    cpu_usage = psutil.cpu_percent()
    if cpu_usage > 80:
        print(time.strftime("%Y-%m-%d_%H-%M-%S") + ' The CPU usage is: ', cpu_usage)

解決 – 若是使用太多記憶體

在Tensorflow裡面有一篇討論串,滿多人都會遇到此問題,其中一位大大建議在GPU上提高可使用的內存,可解決此問題

gpus = tf.config.experimental.list_physical_devices('GPU')
tf.config.experimental.set_memory_growth(gpu, True)

討論串: Optimization loop failed: Cancelled: Operation was cancelled

另外也可以考慮設置合適的 batch_size、限制模型大小或減少數據集規模是一種在沒有 GPU 或內存受限的情況下控制內存使用的方法。下面是一些方法可以考慮:

  • 調整 batch_size:batch_size 是每次模型訓練時用於處理的樣本數量。較大的 batch_size 可能會導致內存不足。你可以嘗試降低 batch_size 的值,以減少內存需求。但要注意,較小的 batch_size 可能會影響訓練過程的穩定性和收斂速度。
  • 限制模型的大小:模型的大小直接影響內存使用。你可以嘗試以下方法來限制模型的大小:
    • 減少模型的層數或參數數量。
    • 使用輕量級模型架構,例如 MobileNet、SqueezeNet 等。
    • 使用模型剪枝技術,減少模型中冗餘參數的數量。
    • 使用低精度(如 16 位浮點數)表示模型的參數,以減少內存佔用。
  • 減少數據集規模:如果數據集過大而導致內存不足,你可以考慮以下方法來減少數據集的規模:
    • 隨機採樣:從原始數據集中隨機選擇一部分樣本作為子集進行訓練。確保採樣後的數據集仍具有代表性。
    • 數據集切片:將大型數據集切割成多個較小的部分,逐個部分進行訓練。可以使用交叉驗證等技術來利用所有數據並評估模型性能。

解決 – 若是使用太多CPU

可嘗試以下方法來減少 CPU 的消耗:

  • 減少數據的處理量:優化輸入數據的大小和復雜度,可以減少 CPU 的負載。例如,可以嘗試縮小圖像尺寸、減少輸入序列的長度或降低數據的維度。
  • 使用批處理預測:通過將多個樣本組成一個批次進行預測,可以減少每個樣本的計算和內存佔用。 Model.predict() 方法默認可以處理批量輸入,你可以將多個樣本一起傳遞給該方法進行預測。
  • 並行處理:如果你的系統支持多線程或多進程,並且你的模型和數據可以進行並行處理,可以使用並行化方法來提高 CPU 的利用率。例如,使用 Python 的 multiprocessing 模塊或 TensorFlow 的 tf.data.Dataset 的並行化功能。
  • 優化模型:檢查你的模型結構和計算圖,看是否有可以優化的部分。可能存在一些冗餘計算或可以簡化的操作。你可以嘗試使用 TensorFlow 的圖優化工具,如 tf.function 和 tf.autograph,來加速模型的計算過程。
  • 使用更高效的庫或算法:某些情況下,使用其他庫或算法可能比 TensorFlow 更高效。你可以嘗試使用其他機器學習庫,如 PyTorch 或 Scikit-learn,並根據你的需求選擇更適合的庫和算法。
  • 升級硬件:如果你的計算機配置允許,可以考慮升級到更強大的 CPU 或添加更多的 CPU 核心。這樣可以提高系統的並行處理能力和整體性能。