gpt4 book ai didi

c++-default_random_engine 始终创建相同的数字系列

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:15:06 24 4
gpt4 key购买 nike

我正在使用神经网络,我想随机创建权重。因此,如果我创建 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.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.5214580.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){

关于c++-default_random_engine 始终创建相同的数字系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22907473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com