學習機器學習(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 學習者,我們大可以使用社群提供的數據集。
以下是我們可以找到數據集的地方:
- Kaggle
- Hugging Faces
另外,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
發表留言