Layers — 网络层 API
BaseLayer
src/nn/layers/baseLayer.py
所有网络层的抽象基类,定义了统一的接口契约。
python
class BaseLayer(ABC):
isTraining: bool
inputCache: np.ndarray | None
outputCache: np.ndarray | None
@abstractmethod
def forward(self, inputData: np.ndarray) -> np.ndarray
@abstractmethod
def backward(self, outputGradient: np.ndarray) -> np.ndarray
def getParameters(self) -> list[np.ndarray]
def getGradients(self) -> list[np.ndarray]
def zeroGrad(self) -> None
def train(self) -> None
def eval(self) -> None
def hasParameters(self) -> bool方法说明
| 方法 | 返回 | 说明 |
|---|---|---|
forward(inputData) | np.ndarray | 抽象方法。前向传播,必须缓存 inputCache 和 outputCache |
backward(outputGradient) | np.ndarray | 抽象方法。反向传播,参数层须写入梯度数组 |
getParameters() | list[np.ndarray] | 返回层的可训练参数列表(基类返回 []) |
getGradients() | list[np.ndarray] | 返回层的梯度列表,顺序须与 getParameters() 一致 |
zeroGrad() | None | 将所有梯度数组就地清零 (fill(0.0)) |
train() | None | 设置 isTraining = True |
eval() | None | 设置 isTraining = False |
hasParameters() | bool | 是否有可训练参数 |
LinearLayer
src/nn/layers/linearLayer.py
全连接线性层,实现
构造函数
python
LinearLayer(
inputDim: int, # 输入维度(必须 > 0)
outputDim: int, # 输出维度(必须 > 0)
useBias: bool = True, # 是否使用偏置
randomSeed: int | None = None # 随机种子
)初始化行为:
- 权重使用 Xavier 均匀初始化:
- 偏置初始化为
(形状 ) - 梯度数组初始化为同形状零矩阵
forward()
python
def forward(self, inputData: np.ndarray) -> np.ndarray| 参数 | 类型 | 形状 | 说明 |
|---|---|---|---|
inputData | np.ndarray | 批量输入 | |
| 返回 | np.ndarray |
异常:
ValueError—inputData不是二维数组ValueError—inputData.shape[1] != inputDim
backward()
python
def backward(self, outputGradient: np.ndarray) -> np.ndarray| 参数 | 类型 | 形状 | 说明 |
|---|---|---|---|
outputGradient | np.ndarray | ||
| 返回 | np.ndarray |
副作用:
self.gradWeights[...] = inputCache.T @ outputGradient(形状) self.gradBias[...] = np.sum(outputGradient, axis=0, keepdims=True)(形状)
数学公式:
ReLULayer
src/nn/layers/activationLayer.py
ReLU 激活层,无参数。
forward()
python
def forward(self, inputData: np.ndarray) -> np.ndarray| 参数 | 类型 | 形状 | 说明 |
|---|---|---|---|
inputData | np.ndarray | 任意 | 输入张量 |
| 返回 | np.ndarray | 同输入 |
backward()
python
def backward(self, outputGradient: np.ndarray) -> np.ndarray异常:
ValueError— 未先调用forward()
SigmoidLayer
src/nn/layers/activationLayer.py
Sigmoid 激活层,无参数。输出范围
forward()
backward()
TanhLayer
src/nn/layers/activationLayer.py
Tanh 激活层,无参数。输出范围
forward()
backward()
激活层共同特性
- 三类激活层均无参数和梯度:
getParameters()→[],getGradients()→[] zeroGrad()为空操作hasParameters()返回False- 输入/输出形状不变