【问题标题】:Custom performance function in MatlabMatlab中的自定义性能函数
【发布时间】:2014-08-06 22:22:35
【问题描述】:

我想在我的神经网络中添加一个自定义性能函数以使用小波函数作为性能(我首先使用小波分解信号,然后重构信号并从中计算性能)

我尝试过这里解释的学术方式: http://www.mathworks.fr/support/solutions/en/data/1-1BYOH/index.html?product=NN&solution=1-1BYOH

所以我创建了一个名为 MyPerformanceFunction.m 的 .m 文件并添加:

function perf = MyPerformanceFunction(e, x, pp)
perf = 1;

并将性能函数更改为:

net.performFcn = 'MyPerformanceFunction';

只是为了测试

但我遇到了一个错误:

Error using struct
Conversion to struct from double is not possible.

Error in network/subsasgn>getDefaultParam (line 2023)
    param = struct(feval(fcn,'defaultParam'));

Error in network/subsasgn>setPerformFcn (line 1886)
net.performParam = getDefaultParam(performFcn);

Error in network/subsasgn>network_subsasgn (line 445)
    if isempty(err), [net,err]=setPerformFcn(net,performFcn); end

Error in network/subsasgn (line 13)
net = network_subsasgn(net,subscripts,v,netname);

Error in nntest3 (line 26)
net.performFcn = 'MyPerformanceFunction';

有人知道它可能来自哪里吗?

我使用 R2013a

谢谢

杰夫

【问题讨论】:

  • 我真的不知道它是如何工作的,但似乎 Matlab 并不期望性能函数返回一个双精度值,而是一个结构体。
  • 正如安德所说。编译器会准确告诉您问题出在哪里:struct(feval(fcn,'defaultParam')); 以及原因:不能对双精度执行 struct。

标签: matlab neural-network


【解决方案1】:

简答:这行不通,因为只有一个函数来实现自定义性能函数是不够的。

长答案:

这一行:

param = struct(feval(fcn,'defaultParam'));

相当于:

param = MyPerformanceFunction('defaultParam')

内置的性能函数,如msessemae 等被设置为除了将perf 作为数字返回之外,它们还可以返回其他信息。例如,仅调用 mae 而没有任何输入会返回:

ans = 

         WARNING1: 'THIS IS AN IMPLEMENTATION STRUCTURE'
         WARNING2: 'THIS INFORMATION MAY CHANGE WITHOUT NOTICE'
             name: 'Mean Absolute Error'
        mfunction: 'mae'
             type: 'performance_fcn'
         typeName: 'Performance Function'
        normalize: 1
            apply: @mae.apply
         backprop: @mae.backprop
      forwardprop: @mae.forwardprop
        dperf_dwb: @mae.dperf_dwb
    parameterInfo: [1x2 nnetParamInfo]
     defaultParam: [1x1 struct]

性能函数不仅仅是返回值perf 的单个函数 - 还有一个关联的附加函数的子目录,所有这些函数都需要存在。如果你想这样做,最好的方法是使用现有的性能函数作为模板。

键入 help nncustom 以查看有关为神经网络创建各种自定义函数的建议。例如我的版本给出:

Performance functions
    Functions created before R2012b must be updated.
    Use mse and its package of subfunctions +mse as templates.

【讨论】:

  • 太好了,谢谢。还有一个问题:当我删除 mse.m 的最后一行时 perf = nncalc.perform(net,t,y,ew,param);并将其替换为: perf = 1000;只是为了测试,这个值以某种方式被绕过,因为 NN 显示了变化的值,就像我没有改变最后一行一样......
  • 您确定它没有在别处分配perf 并执行return,因此跳过该行吗? (您可以在该行之前放置disp 行或其他内容以检查它是否被调用)。否则,可能与某个子函数(例如apply, backprop, forwardprop, dperf_dwb)被调用以调整perf 的值有关。老实说,我不知道如何/如果/何时/为什么使用这些子功能。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 2019-12-30
相关资源
最近更新 更多