我正在使用神经网络,所以我想随机创建权重。因此,如果我创建30个神经网络,那么每个神经网络最终都具有相同的权重(假定是随机的),因此当我给它们提供相同的输入时,输出应该是相同的,否则就不会。有什么帮助吗?
这是主要功能
int main(){
std::vector<Improved_NN> v;
std::random_device rd;
std::default_random_engine generator(rd());
std::uniform_real_distribution<double> distribution(-1.0,1.0);
for(int i = 0; i < 30; i++)
{
Improved_NN temp;
temp.initialize_weights(generator, distribution);
v.push_back(temp);
}
Board temp;
for(int i = 0; i < 30; i++)
{
std::cout <<"\n" << v[i].executeFromExternal(temp);
}
而initialize_weights在这里:
void Improved_NN::initialize_weights(std::default_random_engine gen,std::uniform_real_distribution<double> dist){
int k,v = 0;
for(k = 0;k<NUM_HIDDEN_1;k++){
for(v = 0 ; v < NUM_INPUTS; v++){
mlp_t.w_h1_i[k][v]=dist(gen);
//std::cout<<mlp_t.w_h1_i[k][v]<<std::endl;
}
}
for(k = 0;k<NUM_HIDDEN_2;k++){
for(v = 0 ; v < NUM_HIDDEN_1; v++){
mlp_t.w_h2_h1[k][v]=dist(gen);
//std::cout<<mlp_t.w_h2_h1[k][v]<<std::endl;
}
}
for(k = 0;k<NUM_HIDDEN_3;k++){
for(v = 0 ; v < NUM_HIDDEN_2; v++){
mlp_t.w_h3_h2[k][v]=dist(gen);
//std::cout<<mlp_t.w_h3_h2[k][v]<<std::endl;
}
}
for (int a = 0 ; a < NUM_HIDDEN_3;a++){
mlp_t.w_o_h[0][a] = dist(gen);
//std::cout<<mlp_t.w_o_h[0][a]<<std::endl;
}
}
这是我每次执行时得到的输出。
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
0.521458
非常感谢你。
最佳答案
好吧,与普通的旧rand()
一样,您需要为生成器提供初始种子,该种子必须具有不同的值,以便生成器生成不同的序列:
std::random_device rd;
std::default_random_engine generator(rd());
另外,正如user3018144所指出的,请使用单个生成器,而不要使用30个不同的生成器:
int main(){
std::vector<Improved_NN> v;
std::random_device rd;
std::default_random_engine generator(rd());
std::uniform_real_distribution<double> distribution(-1.0,1.0);
for(int i = 0; i < 30; i++)
{
Improved_NN temp;
/*Problem is here*/
temp.initialize_weights(generator, distribution);
v.push_back(temp);
}
Board temp;
for(int i = 0; i < 30; i++)
{
std::cout <<"\n" << v[i].executeFromExternal(temp);
}
//for the number of generations, do this....
}
另外,就在这里:
void Improved_NN::initialize_weights(std::default_random_engine gen,std::uniform_real_distribution<double> dist){
您正在按值传递生成器,这将创建现有生成器的拷贝。通过引用传递:
void Improved_NN::initialize_weights(std::default_random_engine& gen, std::uniform_real_distribution<double>& dist){