# PyTorch入門1
:::spoiler {state=open}<h5>by</h5>
>林侑辰
----
## 認識人工智慧
+ Artificial Intelegence 人工智慧
+ Machine Learning 機器學習
+ Deep Learning 深度學習

----
### 機器學習的概念
我們藉由將資料丟給我們設定好的演算法或神經網路,使它從這些資料中學習來找出規律,使它得以從經驗中學習並且能有不同功能,如:預測,分類...
***
### 三大類學習方法
監督式學習、非監督式學習、強化學習
----
#### 監督式vs非監督式學習
+ 監督式學習:資料已有答案,例如:分類貓的照片以及狗的照片
+ 非監督式學習:資料並無答案,需要藉由程式來進行聚類等處理

----
#### 強化學習:
+ agent自行藉由環境的回饋(Reward)選擇行為

----
## PyTorch簡介
PyTorch是一個起初由FB/META開發的機器學習函式庫,現今開源且廣受各大企業使用,如:Tesla、Microsoft等...。
內建了許多用於python的機器學習功能、演算法、預建模型等等...
+ 可使用GPU/TPU(Tensor Processing Unit)加速運算

----
### 瞭解訓練模型的步驟

----
### 實作
+ 編譯環境
我們會使用Google Colab,是一個基於雲端的免費 Jupyter 筆記本環境,讓使用者可以在瀏覽器上寫程式碼,並且可以利用 Google 的雲端運算資源執行程式碼。
----
+ 使用方法
進入google雲端硬碟,按下新增之後就可以選擇Google Colaboratory

----
簡單範例:試試看預測值是否跟實際值符合
```python=
x = 3 #1.準備資料
y = 6 # 設定實際值
class SimpleLinearRegression: #2.建立模型
def __init__(self):
self.slope = 2 # 設定斜率為2
def predict(self, value):
return self.slope * value
model = SimpleLinearRegression() #3.進行預測
y_pred = model.predict(x)
print("預測值:",y_pred,"實際值:",y) #4.衡量模型
```
----
### 認識模型結構
#### import
將必要使用到的函式庫導入
```python=
import torch
import torch.nn as nn
import torch.optim as optim
```
----
#### 資料準備
```python=
x_train = torch.rand((100, 4))
y_train = torch.rand((100, 1))
```
----
- Tensor/張量:
PyTorch tensor可以加速電腦的運算速度

----
#### 模型架構:
[神經網路](https://evan-hsiao.medium.com/%E5%BE%9Ecoursera%E5%AD%B8%E7%BF%92%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92-bd6bad6f5e14)
- 輸入層負責接收外部輸入,輸出層負責產生最終輸出,而隱藏層則通過特徵提取和轉換來實現神經網絡的計算和學習。

----
向前傳播(forward propagation):
每一層網路裡面的每個節點,都會如圖所示,把前一層所有的節點視為特徵,並將每個特徵乘上權重後得到z,再經由啟動函數得到a,形成新的節點。
----
+ 使用Class來架構模型或神經網路:例如
```python=
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(4, 8)
self.relu = nn.ReLU() # Activation function
self.fc2 = nn.Linear(8, 1)
def forward(self, x):
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
```
----
[Activation Function?](https://zh.wikipedia.org/zh-tw/%E6%BF%80%E6%B4%BB%E5%87%BD%E6%95%B0)
常見的activation function

----
簡而言之,Activation Function,就是把計算好了的輸入值standardize 好,規範它的「輸出數值之範圍」,「輸出數值的相互關係」
 to 
使用ReLU做轉換的結果
----
#### 建立訓練迴圈
[Loss Fuction](https://cinnamonaitaiwan.medium.com/cnn%E6%A8%A1%E5%9E%8B-%E6%90%8D%E5%A4%B1%E5%87%BD%E6%95%B8-loss-function-647e13956c50)
用於衡量模型預測與實際目標之間的差異。以下是兩種常見的損失函數及其用途:
- Mean Squared Error:用於回歸問題,計算預測值與實際值之間的平方差,然後取平均值。
- Cross Entropy Loss:用於分類問題,特別是在多類別分類中。它衡量模型預測的概率分佈與實際標籤之間的差異。
----
[Optimizer](https://medium.com/%E9%9B%9E%E9%9B%9E%E8%88%87%E5%85%94%E5%85%94%E7%9A%84%E5%B7%A5%E7%A8%8B%E4%B8%96%E7%95%8C/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92ml-note-sgd-momentum-adagrad-adam-optimizer-f20568c968db)
在機器學習中用於調整模型的參數,以最小化損失函數。它決定了在模型訓練過程中如何調整參數,以使模型更好地擬合訓練數據。
- Gradient Descent:是最基本的優化算法之一,通過計算損失函數對參數的梯度,來更新參數值以降低損失。
- Adam:結合了動量和自適應學習率的方法,通常在實踐中表現良好。
----
初始化模型:
```python=
model = SimpleNN()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
num_epochs = 10000
```
----
迴圈本體:
```python=
for epoch in range(num_epochs):
outputs = model(x_train)
loss = criterion(outputs, y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch+1) % 1000 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
```
----
{"title":"PyTorch入門 1","description":"先手基礎知識","showTags":"false","contributors":"[{\"id\":\"0007669a-47f5-43b3-9d2c-38fa9230ec81\",\"add\":5947,\"del\":1694}]"}