C 训练mnist的注意事项 - housekeeper-software/tech GitHub Wiki

1.初始化权重

从标准正态分布中采样数据,有正数和负数,如果都是正数,收敛很慢,或者导致根本不收敛
static std::mt19937 func_rng_(std::chrono::steady_clock::now().time_since_epoch().count());
static std::normal_distribution<double> func_normal_dist_(0.0, 1.0); // 均值0,标准差1

Tensor randn_tensor(const std::vector<int64_t>& shape) {
  Tensor tensor(shape); // 根据形状创建 Tensor

  // 遍历所有元素,填充从标准正态分布采样的数据
  for (size_t i = 0; i < tensor.size(); ++i) { // 使用 tensor.size() 获取扁平大小
    tensor.data()[i] = func_normal_dist_(func_rng_); // 使用文件作用域的静态对象
  }

  return tensor;
}

前向传播

非常简单,用Relu函数对Z值整流即可。

反向传播

1.计算最后一层的softmax值
2.交叉熵对softmax求偏导
⚠️ **GitHub.com Fallback** ⚠️