OpenCV是否使用零初始化权重矩阵,cv :: ml :: ANN_MLP

时间:2018-01-03 13:17:26

标签: c++ opencv neural-network opencv3.3

在OpenCV docs here

中提到了它
  

人工神经网络 - 多层感知器。

     

与ML中构建和训练的许多其他模型不同   曾经,在MLP模型中,这些步骤是分开的。首先是网络   使用非默认值创建指定拓扑   构造函数或方法ANN_MLP :: create。 设置所有权重   为零。然后,使用一组输入和训练网络   输出向量。训练程序可以重复多次,   也就是说,可以根据新的训练数据调整权重。

还提到了:

  

UPDATE_WEIGHTS

     

更新网络权重,而不是从头开始计算。   在后一种情况下,使用Nguyen-Widrow算法初始化权重。

所以我想知道当我去训练模型时,重量初始化会发生什么。与OpenCV 3.3.1相关的答案也很受欢迎

1 个答案:

答案 0 :(得分:4)

你有理由怀疑文件吗? OpenCV是开源库,因此您可以自己查看下面的内容here

ANN_MLPImpl()
{
    clear();
    setActivationFunction( SIGMOID_SYM, 0, 0);
    setLayerSizes(Mat());
    setTrainMethod(ANN_MLP::RPROP, 0.1, FLT_EPSILON);
}

当您致电train init_weights()时,可能会被称为

bool train( const Ptr<TrainData>& trainData, int flags )
{
    // Some code
    // ... and link weights
    if( !(flags & UPDATE_WEIGHTS) )
        init_weights();
    // Even more code

这里是init_weights()

void init_weights()
{
    //... More code
        // initialize weights using Nguyen-Widrow algorithm
        for( j = 0; j < n2; j++ )
        {
            double s = 0;
           // .. more initialization code