我正在使用神经网络,我想随机创建权重.因此,如果我创建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);
}
Run Code Online (Sandbox Code Playgroud)
而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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我每次执行时得到的输出.
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());
Run Code Online (Sandbox Code Playgroud)
另外,正如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....
}
Run Code Online (Sandbox Code Playgroud)
另外,就在这里:
void Improved_NN::initialize_weights(std::default_random_engine gen,std::uniform_real_distribution<double> dist){
Run Code Online (Sandbox Code Playgroud)
您按值传递生成器,这将创建现有生成器的副本.通过引用代替:
void Improved_NN::initialize_weights(std::default_random_engine& gen, std::uniform_real_distribution<double>& dist){
Run Code Online (Sandbox Code Playgroud)