Skip to content

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抽象方法。前向传播,必须缓存 inputCacheoutputCache
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

全连接线性层,实现 Y=XW+b

构造函数

python
LinearLayer(
    inputDim: int,            # 输入维度(必须 > 0)
    outputDim: int,           # 输出维度(必须 > 0)
    useBias: bool = True,     # 是否使用偏置
    randomSeed: int | None = None  # 随机种子
)

初始化行为

  • 权重使用 Xavier 均匀初始化WU[6nin+nout,6nin+nout]
  • 偏置初始化为 0(形状 (1,outputDim)
  • 梯度数组初始化为同形状零矩阵

forward()

python
def forward(self, inputData: np.ndarray) -> np.ndarray
参数类型形状说明
inputDatanp.ndarray(N,din)批量输入
返回np.ndarray(N,dout)XW+b

异常

  • ValueErrorinputData 不是二维数组
  • ValueErrorinputData.shape[1] != inputDim

backward()

python
def backward(self, outputGradient: np.ndarray) -> np.ndarray
参数类型形状说明
outputGradientnp.ndarray(N,dout)LY
返回np.ndarray(N,din)LX

副作用

  • self.gradWeights[...] = inputCache.T @ outputGradient(形状 (din,dout)
  • self.gradBias[...] = np.sum(outputGradient, axis=0, keepdims=True)(形状 (1,dout)

数学公式

LX=LYWTLW=XTLYLb=n(LY)n,:

ReLULayer

src/nn/layers/activationLayer.py

ReLU 激活层,无参数。

forward()

ReLU(x)=max(0,x)
python
def forward(self, inputData: np.ndarray) -> np.ndarray
参数类型形状说明
inputDatanp.ndarray任意输入张量
返回np.ndarray同输入max(0,x)

backward()

Lx=Ly1{x>0}
python
def backward(self, outputGradient: np.ndarray) -> np.ndarray

异常

  • ValueError — 未先调用 forward()

SigmoidLayer

src/nn/layers/activationLayer.py

Sigmoid 激活层,无参数。输出范围 (0,1)

forward()

σ(x)=11+ex

backward()

Lx=Lyy(1y)

TanhLayer

src/nn/layers/activationLayer.py

Tanh 激活层,无参数。输出范围 (1,1)

forward()

tanh(x)=exexex+ex

backward()

Lx=Ly(1y2)

激活层共同特性

  • 三类激活层均无参数和梯度getParameters()[]getGradients()[]
  • zeroGrad() 为空操作
  • hasParameters() 返回 False
  • 输入/输出形状不变