我正在尝试用C ++实现神经网络。我创建了一个类“神经”,每个神经元都有一个权重向量定义如下:
std::vector <float> weight;
我想在我的主要功能中创建一个神经元矢量。每个神经元必须随机填充其权重向量。
这是我尝试过的方式:
每个神经元都有一种填充权重向量的方法
void neural::fillWeight(int numWeight)
{
srand(time(NULL));
for (size_t i = 0; i < numWeight; i++)
{
std::cout << "on viens de mettre un poid dans le vecteur" << std::endl;
this->poid.push_back(rand());
}
}
我在这里称呼它:
std::vector <neural> vectN ;
for (size_t i = 0; i < 5; i++)
{
neural test = neural(i, 1, 4);
vectN.push_back(test);
}
问题是载体中的每个神经元都具有相同的权重向量。我该如何解决这个问题?提前感谢您的帮助
例如,srand(time(NULL));
有一次在main,或者因为你的程序在执行时可能非常快,你在同一秒内停留并重新启动rand序列以重做同样的事情在neural::fillWeight
这里有几个问题。
srand(time(NULL));
中调用fillWeight
将在向量之间引入显着的(在您的情况下完美!)相关性。rand
虽然在许多情况下很有用,但却有其统计缺陷。rand
返回一个整数类型,从名称判断你不需要[0,1]中的数字?如果你能够忍受(3) - 如果你正在建立一个“未经训练”的网络,你很可能会这样做 - 那么解决这些问题的一种方法是将种子传递给fillWeight
并使用快速和脏这些术语的生成器:
void neural::fillWeight(int numWeight, std::uint32_t I){
for (size_t i = 0; i < numWeight; i++){
std::cout << "Some fancy French" << std::endl;
this->poid.push_back(1.0f * I / std::numeric_limits<std::uint32_t>::max());
I = 1664525 * I + 1013904223; // Donald Knuth's numbers.
}
如果您想要负数或不同范围,请将转换调整为float
。然后使用“外部”Mersenne-Twister生成器生成传递给函数的I
s。
如果这没有足够的统计属性,那么您可能需要使用“全局”Mersenne Twister生成器。
使用#include <random>
中定义的随机数并进行初始化
std::default_random_engine engine((std::random_device())());
std::uniform_int_distribution<int8_t> rand_dist(0, std::numeric_limits<int8_t>::max());
通过调用得到一个随机的int
(随机int)rand_int = rand_dist(engine);
你可能还需要添加<limits>