# PyTorch入門2 :::spoiler {state=open}<h5>by</h5> >林侑辰 <h5>圖片皆取自網路</h5> ---- ## 深度學習流程詳細方法 ---- # 資料的來源-資料集 ---- ## 什麼是資料集? - 資料集是一組按照某種順序排列的數據集合。它可以包含各種形式的數據,從一系列數組到數據庫表格。 - 下表展示了一個資料集的示例: | Column 1 | Column 2 | Column 3 | |----------|----------|----------| | Data | Data | Data | | Data | Data | Data | | Data | Data | Data | ---- ## 資料集的類型 - 數值型數據:例如房價、溫度等。 - 分類型數據:例如是/否、真/假、藍/綠等。 - 有序型數據:這些數據類似於分類型數據,但可以根據比較進行測量。 ---- ## 資料集的需求 - 在建立機器學習/人工智慧項目時,收集和準備資料集是最關鍵的部分之一。 - 在開發機器學習項目時,開發人員完全依賴於資料集。在構建機器學習應用程序時,資料集被分為兩部分:訓練資料集和測試資料集。 ---- ## 常見的資料集網站 - [Kaggle 資料集](https://www.kaggle.com/datasets) - [Google 的資料集搜索引擎](https://datasetsearch.research.google.com/) - [電腦視覺資料集](https://github.com/jbhuang0604/awesome-computer-vision#datasets) - [政府資料集](https://data.gov.tw/) - [Scikit-learn 資料集](https://scikit-learn.org/stable/datasets/index.html) ---- - 一些代表性資料集: - 分類:鳶尾花資料集-`iris dataset`、手寫數字辨識資料集-`mnist` - 迴歸:波士頓房價資料集-`boston housing` ---- ### 資料前處理 (Data Preprocessing) 可以在pandas與sklearn函式庫中的preprocessing中找到許多常用的方法函式 ---- #### Data Cleaning - 清理/補缺失值 dropna/fillna - 處理重複數據 - 處理日期格式 - 處理大小寫問題 ---- 範例: ```python! import pandas as pd # 創建包含缺失值的 DataFrame data = { 'A': [1, None, 3, 4, 5], 'B': ['a', 'b', 'c', 'd', None] } df = pd.DataFrame(data) # 刪除包含缺失值的行 cleaned_df = df.dropna() print(cleaned_df) ``` ---- 其他方式: ```python # 格式化數據:將日期轉換為統一的格式 df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d') # 處理不一致的數據:統一類別名稱的大小寫 df['Category'] = df['Category'].str.lower() ``` ---- #### Data Transformation - 標準化數據 (Standard Scale) - 將數據按照平均值為0,標準差為1進行轉換 - 歸一化數據 (Normalization) - 將數據縮放到一個特定的範圍,例如 [0, 1] 或 [-1, 1] ---- 範例: ```python! from sklearn.preprocessing import StandardScaler data = [[0, 0], [0, 0], [1, 1], [1, 1]] scaler = StandardScaler() scaled_data = scaler.fit_transform(data) ``` ---- #### 數據降維 (Data Reduction) - 主成分分析 (PCA) - 通過線性投影將數據投影到低維空間,保留最重要的特徵 - 特徵選擇 (Feature Selection) - 選擇最具代表性的特徵,去除冗餘信息 ---- #### Encoding Label Encoding - 將類別型變量轉換為數字表示 ![image](https://hackmd.io/_uploads/Bkoor0URT.png =60%x) ---- One-Hot Encoding - 將類別型變量轉換為二進制向量表示 ![image](https://hackmd.io/_uploads/SyD9HAICT.png =60%x) ---- 範例: ```python! from sklearn.preprocessing import LabelEncoder labels = ['cat', 'dog', 'cat', 'fish'] encoder = LabelEncoder() encoded_labels = encoder.fit_transform(labels) print(encoded_labels) ``` ---- ### Overfitting跟Underfitting - 機器學習模型在訓練過程中可能出現的問題 - 影響模型性能的重要因素 ---- #### Overfitting - 定義:模型過度擬合訓練數據,導致在測試數據上表現不佳 - 原因:模型過於複雜,學習了訓練數據中的噪音和細節 - 解決方法: - 減少模型複雜度 - 增加訓練數據量 ---- #### Underfitting - 定義:模型無法在訓練數據和測試數據上都表現良好 - 原因:模型過於簡單,無法捕捉數據中的關鍵特徵 - 解決方法: - 增加模型複雜度 - 增加特徵數量 - 增加訓練時間 ---- #### 如何避免Overfitting ---- Dropout - 在訓練過程中隨機丟棄一部分神經元,防止模型依賴特定神經元,降低過擬合 - 使用方法:在模型中添加 `Dropout` 層,設置丟棄比例。 ```python! nn.Dropout(p=0.5) #丟棄50%的神經元 ``` ![image](https://hackmd.io/_uploads/SJrYGkP0a.png =65%x) ---- Early Stopping - 使用方法:在訓練過程中定期檢查驗證loss,如果超過一定次數未下降則停止訓練。 - ![image](https://hackmd.io/_uploads/HyphQyw0p.png =60%x) ---- Data Augmentation - 使用方法:對圖像數據進行旋轉、縮放、平移、翻轉等變換,生成新的訓練樣本。 - 優點:增加訓練數據量,改善模型泛化能力,減少過擬合風險。 ![image](https://hackmd.io/_uploads/ByBLXywAT.png =20%x) -> ![image](https://hackmd.io/_uploads/B1-zm1v0p.png =45%x) ---- ### 全連接神經網絡(MLP) 主要用於解決簡單的問題,如回歸或分類 包含多個全連接層 我們在PyTorch使用的是 [nn.Linear()](https://pytorch.org/docs/stable/generated/torch.nn.Linear.html) 每個神經元與上一層的所有神經元相連 可以學習到數據中的模式和規律,從而進行預測 ---- `nn.Linear()`類別內的處理 ![image](https://hackmd.io/_uploads/SkzVuAUCp.png) - input:你輸入的資料 假設`(4,3)` - weight:相同形狀並以特定方式生成的矩陣`(4,3)` - T:表示做轉置處理`(3,4)` - bias:跟outputshape一樣形狀的矩陣`(3,)` ---- ### 卷積神經網絡(CNN) 主要用於處理圖像相關任務 可用於圖像分類、目標檢測和圖像分割等任務 ![image](https://hackmd.io/_uploads/H14NKKU0T.png =60%x) ---- ### 循環神經網絡(RNN) 主要用於處理序列數據 可用於語言建模、文本生成和情感分析等任務 ### 長短期記憶網絡(LSTM) 特殊的RNN類型,用於處理長期依賴性 解決RNN中的梯度消失或爆炸問題 ![image](https://hackmd.io/_uploads/HJ9ctYLAT.png =80%x) ---- ### 生成對抗網絡(GAN) 由生成器和判別器組成 用於生成逼真的圖像、音頻等數據,以及風格轉換和圖像增強等任務 ![image](https://hackmd.io/_uploads/ry60YtL06.png =70%x) ---- ### 遷移學習模型 如VGG、ResNet、Inception等 預先在大規模數據集上訓練,可用於特征提取和微調等任務 ![image](https://hackmd.io/_uploads/rJ1ujtLAa.png =50%x) ---- ### 自編碼器(Autoencoder) 用於學習有效的表示 通常用於降維、特征提取和生成數據等任務 ![image](https://hackmd.io/_uploads/BJxooKICT.png =60%x) ---- ### 深度強化學習模型 如深度Q網絡(DQN)、策略梯度方法等 用於解決強化學習問題,如遊戲玩法、機器人控制等 ---- ## 導入dataset進行預測 - iris dataset是一個常用的數據集,包含了150個樣本,分為三個類別,每個類別有50個樣本。 - 我們將使用神經網絡模型來訓練模型,並使用iris dataset進行預測。 ---- ## 神經網絡模型 - 在這個示例中,我們將使用一個簡單的全連接神經網絡模型來預測iris dataset的類別。 ```python import torch import torch.nn as nn class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(4, 10) # 輸入層到隱藏層 self.fc2 = nn.Linear(10, 3) # 隱藏層到輸出層 def forward(self, x): x = torch.relu(self.fc1(x)) x = self.fc2(x) return x model = Net() ``` ---- ## 訓練和評估模型 - 我們將使用iris dataset中的前120個樣本作為訓練集,後30個樣本作為測試集。 - 訓練模型的過程: ```python import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler iris = load_iris() X = iris.data y = iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` ---- ```python # 標準化數據 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) ``` ---- ```python # 轉換為Tensor X_train = torch.tensor(X_train, dtype=torch.float32) y_train = torch.tensor(y_train, dtype=torch.long) X_test = torch.tensor(X_test, dtype=torch.float32) y_test = torch.tensor(y_test, dtype=torch.long) ``` ---- ```python # 定義損失函數和優化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01) ``` ---- ```python # 模型訓練 num_epochs = 100 for epoch in range(num_epochs): optimizer.zero_grad() outputs = model(X_train) loss = criterion(outputs, y_train) loss.backward() optimizer.step() ``` ---- ```python # 模型評估 model.eval() with torch.no_grad(): outputs = model(X_test) _, predicted = torch.max(outputs, 1) accuracy = (predicted == y_test).sum().item() / len(y_test) print(f'Test Accuracy: {accuracy}') ``` ----
{"title":"PyTorch入門2","description":"林侑辰","contributors":"[{\"id\":\"0007669a-47f5-43b3-9d2c-38fa9230ec81\",\"add\":7505,\"del\":1022}]"}
    94 views