TensorFlow點入門 – 機器學習與數據

學習機器學習(Machine Learning)的時候,除非你只是應用已經訓練好的模型(例如ChatGPT, MidJourney)那些。但如果你想自己建立模型(Model),就必須要接觸模型需要的數據。而這次的分享,會簡單說說關於Machine Learing和數據的關係。

數據的重要

在Machine Learning (ML)的領域中,數據(Data)可以算是最重要的部分;
數據主要有以下兩項任務:

  • 訓練模型
  • 評估模型準確率

所以在沒有數據之前,模型基本上會不能進行正常的預測,至於原因,可以參考我前篇的文章( 實作簡單TensorFlow模型(Model))。

還有這些數據會影響ML模型表現的事情:

  • 不夠數據,模型就不能正確預測結果。
  • 越多數據,理論上模型更有知識。
  • 數據好壞會影響預測的結果,Good Data,Good Model。
  • 原始數據(圖片、影片、…) 能否轉換為模型需要的數值。
  • 轉換或選取原始數據那些數值。

數據集 (Dataset) 是什麼

在Machine Learning (ML)的領域中,我們會用數據整理為數據集(Dataset)。
通常DataSet包含這2個部分:

  • 輸入
  • 輸出 (預測結果)

基於以上的作用,數據集會分割為分為部份:

  • Training Set : 訓練用的數據
  • Testing Set :評估模型用的數據
  • Validation Set :用於調整模型參數和優化模型的數據,類似Testing set,但是還是在訓練過程中使用

以下是數據集的例子:

例子1:Object Detection
輸入:圖片
輸出:圖片中的物件的位置
https://huggingface.co/datasets/detection-datasets/coco

例子2: 圖片分類
輸入:圖片
輸出:圖片對應的標籤
https://huggingface.co/datasets/fashion_mnist

例子3: ChatGPT
輸入:提示Prompt
輸出:提示應回應的結果
https://huggingface.co/datasets/teknium/GPT4-LLM-Cleaned

不過有一些數據,是類似Google Sheet的數據表,沒有明確的輸入/輸出,這一些數據,我們就需要定義那些是輸入、輸出來讓AI尋找它們的關係。

標量、向量、矩陣、張量

在研究數據時候,我們會遇上不同維度的數值,他們是:

  • 標量(Scalar):單一個數值的數據。
  • 向量(Vector):一維數據,例如座標(x, y, z)就是可以用Vector代表。
  • 矩陣(Matrix):2維數據,例如圖片數據。
  • 張量(Tensor):多維數據,多張圖片的數值,其實就用Tensor來代表。

這些數據類型在學習和應用Machine Learning時,很常會遇上的。

數據類型

當我們收集或獲取數據的時候,需要考慮如何把相關資訊化為數字,這時候就要考慮如何把輸入數據利用 Feature encoding 或 extraction 把資訊變成我們需要的張量(Tensor)。

特徵編碼(Feature Encoding)

在我們編程的世界裡,基本上有很多可以選擇的數據類型,例如文字(字串 String)、圖片(JPEG、PNG)、影片(MP4、MOV)、聲音(WAV、MP3);
但是在ML的世界,核心計算都是使用上面提及的標量、向量、矩陣、張量。

所以,學習ML其中一樣常常進行就是對輸入源數據進行"特徵編碼(Feature Encoding)“,才能讓ML系統進行數據分析。

以下是一些例子:

  • 100×100 灰階 圖片
    • 類型:JPEG
    • 數據:100 x 100 Matrix
  • 句子
    • 類型:String
    • 數據:N x 2 Matrix,每個row數值是該index代表詞語出現的次數
  • 聲音
    • 類型: WAV
    • 數據:Mel Spectrogram

形狀(Shape) 與維度

除了考慮數據的數值,還需要考慮Tensor的形狀(Shape)和維度(Dimension);有一些Model,例如CNN,需要數據以某個形狀(Shape)才能輸入到模型;

簡單來說,需要我們事前利用代碼修改相關形狀。
例如這個例子:

50張 100x100pixels 彩色照片的的數據集的形狀是:(50, 100, 100, 3)

  • 50: 圖片數量
  • 100: 圖片寬的pixels
  • 100: 圖片高的pixels
  • 3: 圖片的顏色數

需要變為 (50, 100, 100) 輸入給 CNN,而方法就是把RGB變成灰階;

相關代碼如下:

import tensorflow as tf
import matplotlib.pyplot as plt

def show_image(image_tensor, cmap):
    info = "Shape: %s, dtype: %s" % (image_tensor.shape, image_tensor.dtype)    
    print(info)
    plt.title(info)
    plt.imshow(image_tensor, cmap=cmap)
    plt.show()

rgb_image = tf.constant(    
    [
        [[0,   0, 0], [  0, 255, 255], [  0, 0, 0]],
        [[0, 255, 0], [255, 255, 255], [255, 0, 0]],
        [[0,   0, 0], [  0, 255, 255], [  0, 0, 0]],
    ], dtype=tf.uint8)    
show_image(rgb_image, cmap=None)

# Convert rgb to grayscale
gray_image = tf.image.rgb_to_grayscale(rgb_image)
gray_image = gray_image[:, :, 0]
show_image(gray_image, cmap=plt.cm.Greys)

好的數據集

好的模型(Model)需要好的數據集才能建立;所以我們需要了解什麼為“好的數據”。

最簡單的原則 – 數據集能反應實際應用時候的數據,或者說使用的樣本能反應現狀。

例如:正式使用時候,使用者是包含不同年齡、性別、民族;但是數據集只有女性的數據,這就代表數據集有所用偏頗而不是好數據。相反,模型是關於中國婦女患糖尿病的機率,那麼數據只有女性就合適了。

除了數據代表性,還有這些考慮的地方:

  • 多少可用於訓練的數據
  • 使用那些特徵Feature
  • 如何Standardise數據
  • 如何進行Data Augmentation, 添加不同情境的數據

如何獲取Data Set

好的數據集需要花時間和心血來製作,但是作為Machine Learning 學習者,我們大可以使用社群提供的數據集。

以下是我們可以找到數據集的地方:

另外,ML 套件們 — Keras、Sklearn和Tensorflow,都是有提供數據集的方法:

例如:Tensorflow可以讓你方便獲取MINST (手寫數字)的數據集。
以下是相關代碼:

import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds

ds = tfds.load('mnist',
    split='train', shuffle_files=True,
    data_dir='~/data_dir')

ds_with_one_sample = ds.take(1)  # Only take a single example

for sample in ds_with_one_sample:  # example is `{'image': tf.Tensor, 'label': tf.Tensor}`
    image, label = sample["image"], sample["label"]
    print("label: ", label, " image shape=", image.shape)
    plt.title("label: %s" % label.numpy().item())
    plt.imshow(image)
    plt.show()

資料來源:https://www.tensorflow.org/api_docs/python/tf/keras/datasets/mnist/load_data

總結

其實關於數據和Machine Learning,有很多東西可以說;
這次分享只是了一些比較基本和入門會遇到的東西,比較需要留意就是
數據的維度(Dimension)和形狀(Shape)和源數據的關係,很多ML的例子在沒有在這方面解說太多,因為會假設大家了解的。

如果有什麼想了解或討論;可透過Facebook和Twitter聯繫我;

另外,請加入我的FB專頁,有新文章發布時,大家就能立即知道了。
Facebook 專頁連結:https://www.facebook.com/kencoder1024
Twitter連結:https://twitter.com/kenlakoo

發表留言

在 WordPress.com 建立免費網站或網誌.

向上 ↑