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求偏导