首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

tiny_cnn 卷積神經網絡源碼深度解析(7):fully_connected_layer 全連接層前向反向傳播實現

     編輯:關於C++

全連接層在 CNN 中的位置

位於網絡末端,接收卷積/池化層輸出的特征向量,輸出分類預測(如 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 隱藏初始化細節,調試需技巧
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved