我正在使用神经网络,我想随机创建权重。所以,如果我创建 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);
}
初始化权重在这里:
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){
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)