位於網絡末端,接收卷積/池化層輸出的特征向量,輸出分類預測(如 MNIST 10 維向量)。LeNet-5 中含全連接層與高斯連接層。
template <typename Activation, typename Filter = filter_none>
class fully_connected_layer : public layer {
Filter filter_; // Dropout 等正則化
// 繼承自 layer:W_, b_, a_, output_, in_size_, out_size_ 等
};
僅調用基類構造:: layer(in_dim, out_dim, weight_dim, bias_dim) {}。基類 layer 封裝虛函數框架、參數存儲、激活函數接口。
const vec_t& forward_propagation(const vec_t& in, size_t index) {
vec_t& a = a_[index];
vec_t& out = output_[index];
// 1. 線性映射:W * in + b
for_i(parallelize_, out_size_, [&](int i) {
a[i] = 0;
for (int c = 0; c < in_size_; ++c)
a[i] += W_[c*out_size_ + i] * in[c];
a[i] += b_[i];
});
// 2. 激活函數
for_i(parallelize_, out_size_, [&](int i) {
out[i] = h_.f(a, i);
});
// 3. Filter 處理(如 Dropout)+ 遞歸下層
auto& next_out = filter_.filter_fprop(out, index);
return next_ ? next_->forward_propagation(next_out, index) : next_out;
}
命名空間 activation 封裝:sigmoid、relu、leaky_relu、softmax、tan_h、tan_hp1m2 等。h_.f 前向,h_.df 導數用於反向傳播。
const vec_t& back_propagation(const vec_t& current_delta, size_t index) {
// 1. Filter 反向
// 2. 計算前層 delta:prev_delta[c] = Σ_r curr_delta[r] * W_[c*out+r] * h'.df(prev_out[c])
// 3. 累積權重梯度:dW[c*out+r] += curr_delta[r] * prev_out[c]
// 4. 累積偏置梯度:db[r] += curr_delta[r]
// 5. 遞歸傳遞前層
return prev_->back_propagation(prev_delta_[index], index);
}
涉及矩陣乘法、Hadamard 積、梯度累積,後續專文詳細解析。
partial_connected_layer 中net << fc 隱藏初始化細節,調試需技巧