partial_connected_layer 是卷積層與下采樣層的公共基類,繼承自 layer。核心成員為五個雙層 vector 映射表,記錄權重、輸出、輸入、偏置的索引關係。
partial_connected_layer(layer_size_t in_dim, layer_size_t out_dim,
size_t weight_dim, size_t bias_dim, float_t scale_factor = 1.0)
: layer(in_dim, out_dim, weight_dim, bias_dim),
weight2io_(weight_dim), out2wi_(out_dim),
in2wo_(in_dim), bias2out_(bias_dim),
out2bias_(out_dim), scale_factor_(scale_factor) {}
fan_in_size():返回連接數(權重總數)fan_out_size():返回輸出特征維度weight_size():返回可學習參數數(權重+偏置)採用 Lambda 表達式封裝三階段:
關鍵代碼片段:
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];
});
for_i(parallelize_, out_size_, [&](int i) {
out[i] = h_.f(a, i); // 激活函數
});
auto& next_out = filter_.filter_fprop(out, index);
return next_ ? next_->forward_propagation(next_out, index) : next_out;
back_propagation 涉及誤差求導、靈敏度傳遞、權重梯度累積,結構較複雜,將在後續專文詳細解析(挖坑待填)。
tiny_cnn 採用流式 API 構建網絡(如 net << conv << pool << fc),調試時難以觀察中間層初始化參數,需特別注意。