【问题标题】:Multi-Layer Perceptrons in EmguCVEmguCV 中的多层感知器
【发布时间】:2017-09-09 23:44:35
【问题描述】:

我正在尝试使用 EmguCV 3.1(OpenCV 库的点 NET 包装器)在 C#(Windows 窗体)中实现多层感知器 (MLP) 神经网络。为了练习这个库,我决定使用 MLP 实现OR 操作。

我使用“Initialize”方法创建 MLP,并使用“Train”方法学习它,如下所示:

private void Initialize()
{
    NETWORK.SetActivationFunction(
    ANN_MLP.AnnMlpActivationFunction.SigmoidSym);

    NETWORK.SetTrainMethod(ANN_MLP.AnnMlpTrainMethod.Backprop);

    Matrix<double> layers = new Matrix<double>(new Size(4, 1));
    layers[0, 0] = 2;
    layers[0, 1] = 2;
    layers[0, 2] = 2;
    layers[0, 3] = 1;
    NETWORK.SetLayerSizes(layers);
}

private void Train()
{
    // providing data for input

    Matrix<float> input = new Matrix<float>(4, 2);
    input[0, 0] = MIN_ACTIVATION_FUNCTION; input[0, 1] = MIN_ACTIVATION_FUNCTION;
    input[1, 0] = MIN_ACTIVATION_FUNCTION; input[1, 1] = MAX_ACTIVATION_FUNCTION;
    input[2, 0] = MAX_ACTIVATION_FUNCTION; input[2, 1] = MIN_ACTIVATION_FUNCTION;
    input[3, 0] = MAX_ACTIVATION_FUNCTION; input[3, 1] = MAX_ACTIVATION_FUNCTION;

    //providing data for output
    Matrix<float> output = new Matrix<float>(4, 1);
    output[0, 0] = MIN_ACTIVATION_FUNCTION;
    output[1, 0] = MAX_ACTIVATION_FUNCTION;
    output[2, 0] = MAX_ACTIVATION_FUNCTION;
    output[3, 0] = MAX_ACTIVATION_FUNCTION;


    // mixing input and output for training
    TrainData mixedData = new TrainData(
        input,
        Emgu.CV.ML.MlEnum.DataLayoutType.RowSample,
        output);

    // stop condition = 1 million iterations
    NETWORK.TermCriteria = new MCvTermCriteria(1000000);

    // training
    NETWORK.Train(mixedData);
}

其中MIN_ACTIVATION_FUNCTIONMAX_ACTIVATION_FUNCTION 分别等于-1.7159 和1.7159 (according to OpenCV Documentation)。经过 1000000 次迭代(如您在停止条件下的代码中所见),我使用如下 Predict 方法测试我的网络进行预测:

private void Predict()
{
    Matrix<float> input = new Matrix<float>(1, 2);
    input[0, 0] = MIN_ACTIVATION_FUNCTION;
    input[0, 1] = MIN_ACTIVATION_FUNCTION;

    Matrix<float> output = new Matrix<float>(1, 1);

    NETWORK.Predict(input, output);
    MessageBox.Show(output[0, 0].ToString());

    //////////////////////////////////////////////

    input[0, 0] = MIN_ACTIVATION_FUNCTION;
    input[0, 1] = MAX_ACTIVATION_FUNCTION;

    NETWORK.Predict(input, output);
    MessageBox.Show(output[0, 0].ToString());

    //////////////////////////////////////////////

    input[0, 0] = MAX_ACTIVATION_FUNCTION;
    input[0, 1] = MIN_ACTIVATION_FUNCTION;

    NETWORK.Predict(input, output);
    MessageBox.Show(output[0, 0].ToString());

    ////////////////////////////////////////////////

    input[0, 0] = MAX_ACTIVATION_FUNCTION;
    input[0, 1] = MAX_ACTIVATION_FUNCTION;

    NETWORK.Predict(input, output);
    MessageBox.Show(output[0, 0].ToString());
}

以下是 NETWORK 预测的示例:
-0.00734469
-0.03184918
0.02080269
-0.006674092

我希望是这样的:
-1.7
+1.7
+1.7
+1.7


我的代码有什么问题?

请注意,我也将 0、1 用于 MIN_ACTIVATION_FUNCTIONMAX_ACTIVATION_FUNCTION 值,但我仍然没有任何好的结果。

更新 1: 我编辑我的代码,因为第一个答案是指我(即使我用 cmets 中引用的想法测试我的代码)。现在我在调用predict 方法时得到NaN

【问题讨论】:

标签: c# neural-network opencv3.1 emgucv


【解决方案1】:

您在提供输出数据时似乎有错误。使用output 数组而不是input

我认为您的输出响应应该是二维矩阵(有 2 列)。最后一层应该有 2 个输出神经元,因为你有 2 个类,例如 (1, 0) is class "True"(0, 1) is class "False"。也尝试改变你的网络架构。逻辑运算符OR 是线性可分的,即它可以使用单个感知器来执行。

【讨论】:

  • 非常感谢您的支持。现在我的问题是所有输出都是 NaN!我该如何解决?
  • 确保先设置层大小,再设置激活函数。见stackoverflow.com/questions/36871277/…。很高兴为您提供帮助!
  • @Babak.Abad 我运行了你的代码并收到了 NaN 结果。我为 .NET Framework 4.5 使用了最新的 NuGet 包 EmguCV v3.1.0.1。此外,我尝试从 Wiki 为 Emgu CV 3.x 运行一个示例,但在调用 network.Predict(...) 后,我对 response 的所有 NaN。在 Emgu CV 中使用 ANN_MLP 是非常不正常的行为,似乎是错误。尝试使用 C++(Open CV)或其他用于神经网络的 C# 库重写您的代码。
  • 感谢您的帮助。我认为这是一个错误。正如你所说,我还测试了不同的组合。你知道任何使用 OpenCL 1.2 的库吗?我测试了 AforgeNet,但由于它不是基于 GPU,因此训练速度并不快。
  • 尝试查看维基页面Comparison of deep learning software。有一些库,例如实验性的Caffe OpenCLOpenCV with OpenCL,但您应该在其上编写 C# 包装器。
【解决方案2】:

根据 EmguCV 的新版本 (Emgu.CV-3.1.0-r16.12),该问题是 3.1.0 版本中的一个错误,现在它已在 Emgu.CV-3.1.0-r16.12 中修复。通过下载这个版本,我得到了来自我的网络的正确响应。

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 2017-01-06
    • 2011-07-01
    • 2011-11-15
    • 2017-06-13
    相关资源
    最近更新 更多