NumPy 基礎運算在深度學習中的應用:+、-、*、/、**、比較、sum/mean/max/min、axis
1. 為什麼先掌握基礎運算?
在深度學習中,我們最終要做的是:
- 對輸入/權重做加法(
+) - 做乘法(
*、矩陣乘法) - 應用非線性函數(
**、relu、sigmoid等) - 計算損失(loss)後,將其 平均(
mean) 或 求和(sum)
PyTorch 的張量運算 完全遵循 NumPy 的基礎運算風格,因此先在 NumPy 中熟悉這些感覺,能讓你在深度學習公式中更清晰地看到結構。
2. 元素級算術運算:+、-、*、/、**
NumPy 陣列之間的基本運算是 元素級(element‑wise) 的。
import numpy as np
x = np.array([1, 2, 3])
y = np.array([10, 20, 30])
print(x + y) # [11 22 33]
print(x - y) # [ -9 -18 -27]
print(x * y) # [10 40 90]
print(y / x) # [10. 10. 10.]
print(x ** 2) # [1 4 9]
- 長度相同的一維陣列互相運算時,逐元素相加
- 二維、三維陣列亦同樣以相同位置進行運算
2.1 與標量(scalar)的運算
與單一數字(標量)運算也同樣自然。
x = np.array([1, 2, 3])
print(x + 10) # [11 12 13]
print(x * 2) # [2 4 6]
print(x / 2) # [0.5 1. 1.5]
這種「所有元素加/乘同一個值」的操作,在深度學習中常用於 正規化、縮放、偏差加入 等。
PyTorch 張量同樣支援此類運算。
x_t + y_t、x_t * 2、x_t ** 2等表達式幾乎可以直接使用。
3. 比較運算:>、<、>=、<=、==、!=
NumPy 陣列之間的比較運算會產生 布林(Boolean)陣列。
import numpy as np
x = np.array([1, 2, 3, 4, 5])
print(x > 3) # [False False False True True]
print(x == 2) # [False True False False False]
這個布林陣列可用於:
- 遮罩(mask),挑選特定元素
- 計算滿足條件的元素個數
範例:
x = np.array([1, -2, 3, 0, -5, 6])
mask = x > 0
print(mask) # [ True False True False False True]
# 只取正數
pos = x[mask]
print(pos) # [1 3 6]
# 正數個數
num_pos = np.sum(mask) # True 1, False 0
print(num_pos) # 3
在深度學習中常見的應用:
- 準確率(accuracy):預測正確的樣本比例
- 條件篩選:只將滿足條件的樣本納入損失計算
PyTorch 也使用相同的模式。
4. 聚合函數:np.sum、np.mean、np.max、np.min
4.1 無 axis:對整個陣列計算
基本形式是對「整個陣列」求和、平均、最大值、最小值。
import numpy as np
x = np.array([1, 2, 3, 4])
print(np.sum(x)) # 10
print(np.mean(x)) # 2.5
print(np.max(x)) # 4
print(np.min(x)) # 1
對二維以上陣列亦同理。
X = np.array([[1, 2, 3],
[4, 5, 6]])
print(np.sum(X)) # 21
print(np.mean(X)) # 3.5
在深度學習中:
- 整個批次或整個資料集的平均損失
- 整體資料的平均/標準差後做正規化
5. 理解 axis 概念
axis 用來指定「沿哪個軸進行運算」。
- 未指定 axis → 對所有元素計算
- 指定 axis → 沿該軸縮減(reduce),保留其餘軸
5.1 以二維陣列為例
import numpy as np
X = np.array([[1, 2, 3],
[4, 5, 6]]) # shape: (2, 3)
axis=0:按列(column)計算
print(np.sum(X, axis=0)) # [5 7 9]
print(np.mean(X, axis=0)) # [2.5 3.5 4.5]
- 結果 shape:
(3,) - 每列的和/平均
- 在深度學習中常用於 計算每個特徵的平均/標準差
axis=1:按行(row)計算
print(np.sum(X, axis=1)) # [ 6 15]
print(np.mean(X, axis=1)) # [2. 5.]
- 結果 shape:
(2,) - 每行的和/平均
- 與 每個樣本的總和/平均 相關
5.2 深度學習中常見的 axis 範例
假設批次資料為:
# (batch_size, feature_dim)
X = np.random.randn(32, 10) # 32 個樣本,10 維特徵
- 每個特徵的平均(feature‑wise mean)
mean_per_feature = np.mean(X, axis=0) # shape: (10,)
axis=0→ 在批次方向縮減- 每列(feature)的平均
- 每個樣本的平均(sample‑wise mean)
mean_per_sample = np.mean(X, axis=1) # shape: (32,)
axis=1→ 在特徵方向縮減- 每行(sample)的平均
5.3 圖像批次中的 axis
以 PyTorch 樣式 (N, C, H, W) 為例。
# N=32, C=3 (RGB), H=W=64
images = np.random.randn(32, 3, 64, 64)
- 整個批次的像素最大值
global_max = np.max(images) # scalar
- 通道平均(RGB 通道平均)
# axis=(0, 2, 3): 只保留通道
channel_mean = np.mean(images, axis=(0, 2, 3)) # shape: (3,)
這是 通道正規化 時常用的模式。
6. 聚合函數 + 比較運算:常見模式
6.1 準確率(accuracy)計算
以二元分類為例:
import numpy as np
# 預測(假設為 0~1 的機率)
pred = np.array([0.2, 0.8, 0.9, 0.3])
# 真實標籤(0 或 1)
target = np.array([0, 1, 1, 0])
# 以 0.5 為閾值產生預測類別
pred_label = (pred > 0.5).astype(np.int32) # [0 1 1 0]
# 正確的為 True
correct = (pred_label == target) # [ True True True True]
accuracy = np.mean(correct) # True=1, False=0
print(accuracy) # 1.0
- 比較運算 → 布林陣列
mean取得準確率
PyTorch 也可用相同方式實作。
6.2 使用遮罩的損失計算
loss = np.array([0.1, 0.5, 0.2, 0.9])
mask = np.array([True, False, True, False])
masked_loss = loss[mask] # [0.1, 0.2]
mean_loss = np.mean(masked_loss)
print(mean_loss) # 0.15000000000000002
當只想將滿足條件的樣本納入損失時,常結合 遮罩 + 聚合函數。
7. 小結:今天學到的基礎運算
以下是本篇的重點整理:
- 算術運算(
+、-、*、/、**) * 基本為 元素級 運算 * 與標量同樣自然 - 比較運算(
>、<、>=、<=、==、!=) * 產生布林陣列 * 可作為遮罩,用於過濾、計數、準確率等 - 聚合函數(
np.sum、np.mean、np.max、np.min) * 無axis時對整個陣列計算 * 指定axis可選擇縮減哪個軸 axis概念 * 2D:axis=0→ 列,axis=1→ 行 * 深度學習:(batch, feature)、(N, C, H, W)等結構中頻繁使用 * 方便計算 feature‑wise、sample‑wise、channel‑wise 統計
熟悉這些基礎運算後,你就能把數學公式「直接」轉成 NumPy / PyTorch 代碼,並在實際模型中快速實現損失、準確率、正規化等核心計算。

目前沒有評論。