# 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
- 將類別型變量轉換為數字表示

----
One-Hot Encoding
- 將類別型變量轉換為二進制向量表示

----
範例:
```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%的神經元
```

----
Early Stopping
- 使用方法:在訓練過程中定期檢查驗證loss,如果超過一定次數未下降則停止訓練。
- 
----
Data Augmentation
- 使用方法:對圖像數據進行旋轉、縮放、平移、翻轉等變換,生成新的訓練樣本。
- 優點:增加訓練數據量,改善模型泛化能力,減少過擬合風險。
 -> 
----
### 全連接神經網絡(MLP)
主要用於解決簡單的問題,如回歸或分類
包含多個全連接層
我們在PyTorch使用的是 [nn.Linear()](https://pytorch.org/docs/stable/generated/torch.nn.Linear.html)
每個神經元與上一層的所有神經元相連
可以學習到數據中的模式和規律,從而進行預測
----
`nn.Linear()`類別內的處理

- input:你輸入的資料 假設`(4,3)`
- weight:相同形狀並以特定方式生成的矩陣`(4,3)`
- T:表示做轉置處理`(3,4)`
- bias:跟outputshape一樣形狀的矩陣`(3,)`
----
### 卷積神經網絡(CNN)
主要用於處理圖像相關任務
可用於圖像分類、目標檢測和圖像分割等任務

----
### 循環神經網絡(RNN)
主要用於處理序列數據
可用於語言建模、文本生成和情感分析等任務
### 長短期記憶網絡(LSTM)
特殊的RNN類型,用於處理長期依賴性
解決RNN中的梯度消失或爆炸問題

----
### 生成對抗網絡(GAN)
由生成器和判別器組成
用於生成逼真的圖像、音頻等數據,以及風格轉換和圖像增強等任務

----
### 遷移學習模型
如VGG、ResNet、Inception等
預先在大規模數據集上訓練,可用於特征提取和微調等任務

----
### 自編碼器(Autoencoder)
用於學習有效的表示
通常用於降維、特征提取和生成數據等任務

----
### 深度強化學習模型
如深度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}]"}