如何在 Matlab 中使用经过训练的神经网络在真实系统中进行分类

Posted

技术标签:

【中文标题】如何在 Matlab 中使用经过训练的神经网络在真实系统中进行分类【英文标题】:How to use trained Neural Network in Matlab for classification in a real system 【发布时间】:2012-12-19 06:18:21 【问题描述】:

我使用 Matlab 神经网络工具箱在包含语音特征和加速度计测量值的数据集上训练了前馈神经网络。 Targetset 包含数据集的两个目标类:0 和 1。训练、验证和性能都很好,我已经为这个网络生成了代码。

现在我需要使用这个神经网络实时识别模式,并在我针对先前训练的 NN 测试新数据集时生成 0 或 1。但是当我发出命令时:

   c = sim(net, j)

其中“j”是一个新的数据集[24x11];取而代之的是 0 或 1 我将其作为输出(我假设我得到正确分类的百分比,但本身没有分类结果):

c =

  Columns 1 through 9

    0.6274    0.6248    0.9993    0.9991    0.9994    0.9999    0.9998    0.9934    0.9996

  Columns 10 through 11

    0.9966    0.9963

那么有什么命令或方法可以让我真正看到分类结果吗?任何帮助都非常感谢!谢谢

【问题讨论】:

【参考方案1】:

我不是 matlab 用户,但从逻辑的角度来看,你错过了一个重要的点:

神经网络的输入是单个向量,您传递的是一个矩阵。因此,matlab 认为您想要对一堆向量(在您的情况下为 11 个)进行分类。所以你得到的向量是这 11 个向量中每一个的输出激活。

输出激活是一个介于 0 和 1 之间的值(我猜你使用的是 sigmoid),所以这是完全正常的。您的工作是获得最适合您的数据的阈值。您可以通过对训练/测试数据的交叉验证或仅选择一个(0.5?)来获得此阈值,然后查看结果是否“良好”并根据需要进行修改。

【讨论】:

嗨,即使我尝试使用单个向量,我也会得到相同的输出。我已经用分类器完成了我需要的一切,我不想进一步更改它(是的,我使用了 sigmoid)。 NN 使用包含 0 和 1 的目标进行训练;所以分类的输出应该是 0 或 1(例如,如果我对 Iris 示例进行了同样的操作,classier 应该给我 specie1 或 specie2),我不需要其他任何东西。如果我遗漏了什么,请纠正我(你是不是想说我得到的这些数字:如果某物接近 0,那么它是一等的,或者如果它接近 1 而不是二等的?),谢谢 @supermus 网络学习了一些大约。对您的输入起作用。函数的输出通常不是直接的 1 或 0,而是介于两者之间。所以输出的解释(选择阈值)必须由你的逻辑基于一些度量或直觉来完成。你有更多关于sim 方法的文档吗?你确定你只提供了一个向量吗? 当我提供单个向量时,我得到一个数字作为输出,但我对数字本身的含义感到困惑。我没有关于 sim 的任何文档:/ @supermus 好吧,因为你写了even if I try with single vector I get the same output 是的,对我来说相同的 0 点,直到昨天未知值 :) 欢呼【参考方案2】:

NN 通常使用逻辑函数将其输出转换为 (0,1) 范围内的值。这不是百分比或概率,只是确定性的相对度量。无论如何,这意味着您必须手动使用阈值(例如 0.5)来区分这两个类别。很难找到最佳阈值,因为您必须在准确率和召回率之间做出最佳权衡。

【讨论】:

@Thomas Jungblut 非常感谢你们!即使在这种形式下,输出对我来说也是完美的,因为我可以在我的项目中使用它!不知道该接受哪个答案:)

以上是关于如何在 Matlab 中使用经过训练的神经网络在真实系统中进行分类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MATLAB 中为英国车牌训练神经网络?

Python scikit-learn:导出经过训练的分类器

在 matlab 上配置和训练后,如何使用神经网络运行预测?

以神经网络使用为例的Matlab和Android混合编程

matlab中的BP神经网络

如何使用经过训练的神经网络创建的权重矩阵在另一个文件中进行预测?