layer_base 是所有層類型的公共基類,封裝了神經網絡層的通用屬性與操作。
| 變量 | 含義 |
|---|---|
in_size_, out_size_ | 輸入/輸出特徵維度 |
parallelize_ | 是否啟用 TBB 多線程加速(默認 true) |
next_, prev_ | 指向下一層/上一層指針,構建網絡拓撲鏈表 |
a_ | 卷積/全連接運算的線性輸出(激活前) |
output_ | 經激活函數後的最終輸出特徵 |
prev_delta_ | 反向傳播傳入的誤差靈敏度 (∂L/∂a) |
W_, b_ | 權重矩陣、偏置向量 |
dW_, db_ | 權重/偏置梯度 (∂L/∂W, ∂L/∂b) |
Whessian_, bhessian_ | 海森矩陣相關(二階優化用,如 Levenberg-Marquardt) |
prev_delta2_ | 誤差對輸入的二階導數 (∂²L/∂x²),全連接層二階反向傳播用 |
layer_base(layer_size_t in_dim, layer_size_t out_dim,
size_t weight_dim, size_t bias_dim)
: parallelize_(true), next_(nullptr), prev_(nullptr) {
set_size(in_dim, out_dim, weight_dim, bias_dim);
}
void set_size(layer_size_t in_dim, layer_size_t out_dim,
size_t weight_dim, size_t bias_dim) {
in_size_ = in_dim; out_size_ = out_dim;
W_.resize(weight_dim); b_.resize(bias_dim);
Whessian_.resize(weight_dim); bhessian_.resize(bias_dim);
prev_delta2_.resize(in_dim);
for (auto& o : output_) o.resize(out_dim);
for (auto& a : a_) a.resize(out_dim);
for (auto& p : prev_delta_) p.resize(in_dim);
for (auto& dw : dW_) dw.resize(weight_dim);
for (auto& db : db_) db.resize(bias_dim);
}
大量使用 C++11 範圍 for 初始化向量容器,簡潔安全。
virtual activation::function& activation_function() = 0; virtual const vec_t& forward_propagation(const vec_t& in, size_t worker_index) = 0; virtual const vec_t& back_propagation(const vec_t& current_delta, size_t worker_index) = 0; virtual const vec_t& back_propagation_2nd(const vec_t& current_delta2) = 0;
virtual void save(std::ostream& os) const {
if (is_exploded()) throw nn_error("infinite weight");
for (auto w : W_) os << w << ' ';
for (auto b : b_) os << b << ' ';
}
virtual void load(std::istream& is) {
for (auto& w : W_) is >> w;
for (auto& b : b_) is >> b;
}
流式保存/加載權重偏置,支持斷點續訓。
void update_weights(optimizer& opt) {
opt.update(W_, dW_, Whessian_); // 權重更新
opt.update(b_, db_, bhessian_); // 偏置更新
}
委託給優化器(SGD, Adam, LM 等)具體更新邏輯,解耦層與優化算法。
template
activation::function& activation_function() override { return Activation::function(); }operator<< / operator>> 調用 save/load,支持 cout << layerconnection_mismatch() — 輸出維度不匹配data_mismatch() — 輸入特徵維度不匹配pooling_size_mismatch() — 池化窗口不整除特徵圖尺寸錯誤函數僅格式化輸出,具體檢查邏輯由調用方(如 network::add_layer)執行。
layer_base 定義框架,layer 注入激活函数optimizer 接口注入,層不關心具體更新規則next_/prev_ 構建層鏈表,network 統一協調前向/反向傳播layer_base 還有其他輔助函數(如可視化輸出 output_to_image),用到時再深入