std::vector<std::vector<double>> weightsInputHidden
时间: 2025-02-14 20:15:25 浏览: 40
### C++ 中使用 `std::vector<std::vector<double>>` 存储神经网络权重
在现代C++编程中,`std::vector` 是一种动态数组容器,能够方便地管理大小可变的对象序列。对于多层感知器(MLP)或其他类型的前馈神经网络而言,每一层中的连接权值可以表示为二维矩阵形式。
#### 初始化与分配内存空间
为了初始化一个用于保存各层之间连接强度数值的向量结构体,在声明时需指定内部元素的数据类型以及外部包裹层数:
```cpp
#include <iostream>
#include <vector>
int main() {
int input_neurons = 784; // 输入层节点数 (例如MNIST图像数据集)
int hidden_neurons = 256; // 隐藏层节点数
int output_neurons = 10; // 输出层节点数
// 创建从输入到隐藏层之间的权重矩阵
std::vector<std::vector<double>> w_input_hidden(hidden_neurons, std::vector<double>(input_neurons));
// 创建从隐藏到输出层之间的权重矩阵
std::vector<std::vector<double>> w_hidden_output(output_neurons, std::vector<double>(hidden_neurons));
return 0;
}
```
上述代码片段展示了如何创建两个不同维度的嵌套向量来分别代表相邻两层间的全部可能路径上的关联度量[^1]。
#### 权重随机化处理
通常情况下,初始状态下会采用某种方式赋予这些参数合理的估计值而非零值,这有助于打破对称性并促进更有效的梯度传播过程。下面给出了一种简单的基于均匀分布的方法来进行这样的操作:
```cpp
#include <random>
// ... 继续上面的例子 ...
double min_val = -0.5;
double max_val = +0.5;
std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(min_val,max_val);
for(auto& row : w_input_hidden){
for(double &val : row){
val=distribution(generator);
}
}
for(auto& row : w_hidden_output){
for(double &val : row){
val=distribution(generator);
}
}
```
这段程序通过引入 `<random>` 库实现了对每条边赋予权重的操作,并确保其取自于给定范围内的连续区间内。
#### 使用已训练好的模型进行预测
当完成一轮完整的反向传播算法更新之后,则可以根据当前所学得的最佳配置来做一些实际的任务推断工作。这里仅提供了一个简化版的概念验证函数作为示范用途:
```cpp
void predict(const std::vector<double>& inputs,
const std::vector<std::vector<double>>& weights_ih,
const std::vector<std::vector<double>>& weights_ho,
std::vector<double>& outputs) {
size_t num_hidden = weights_ih.size();
size_t num_outputs = weights_ho.size();
// 计算隐含层激活状态
std::vector<double> hidden(num_hidden);
for(size_t h=0; h<num_hidden; ++h){
double sum = 0.0;
for(size_t i=0; i<inputs.size(); ++i){
sum += inputs[i]*weights_ih[h][i];
}
hidden[h]=sigmoid(sum); // 假设使用Sigmoid激活函数
}
// 计算最终输出结果
outputs.resize(num_outputs);
for(size_t o=0; o<num_outputs; ++o){
double sum = 0.0;
for(size_t h=0; h<num_hidden; ++h){
sum+=hidden[h]*weights_ho[o][h];
}
outputs[o]=sigmoid(sum);
}
}
```
此部分逻辑描述了怎样利用之前构建起来的知识体系去解决新遇到的问题实例,其中涉及到了正向传递计算流程及其相应的数学变换关系。
阅读全文
相关推荐


















