【问题标题】:Supplied objective function must return a scalar value提供的目标函数必须返回一个标量值
【发布时间】:2019-06-13 23:50:35
【问题描述】:

我正在尝试在 Matlab 中编写 ML 算法。这些是我的不同功能:

sigmoid.m:

function g = sigmoid(z)
g = zeros(size(z));
g = 1 ./ (1+exp(z));

costFunction.m

function [J, grad ] = costFunction(theta, X, y)

m = length(y); % number of training examples
z = -X * theta;
g = sigmoid(z);
J = 1/m * ((-y * log(g)') - ((1 - y) * log(1 - g)'));

grad = zeros(size(theta'));
grad = (1/m) * (X' * (g - y));

ex2.m(这是我项目的主文件,我把相关行放在我得到这个错误信息)

options = optimset('GradObj', 'on', 'MaxIter', 400);

[theta, cost] = ...
    fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);

错误信息:

使用 fminunc 时出错(第 348 行)提供的目标函数必须返回 一个标量值。

ex2 中的错误(第 97 行) fminunc(@(t)(costFunction(t, X, y)), initial_theta,选项);

不知道上面有没有足够的信息?如果没有,请告诉我以添加额外信息。

【问题讨论】:

  • 错误是说目标函数(这里是costFunction())需要返回单个值(即标量值),而不是数组或矩阵。您没有显示 Xy 是什么,也没有显示您的 initial_theta,所以很难说函数返回了什么,因为我们不知道传入的是什么。如果你给它会很有帮助minimal reproducible example
  • 您的成本函数同时返回Jgrad,因此它返回一个向量而不是fminunc 期望的标量值。我不太记得我的神经网络数学,但我认为你需要最小化 J,所以你应该编辑 costFunction.m 以只返回这个。
  • @Justin: X is a 100*1 matrix , y is a 100*1 matrix, initial_theta 是一个 3*1 矩阵, g 是一个 100*1 矩阵` , J is a 100*100 matrixgrad is a 3*1 matrix
  • @RPM:这是 coursera 上的作业,costfunction 的返回值是预定义的!所以你的意思是他们在创建这个练习时犯了错误?
  • @RPM:也许我应该在 J 中做乘法运算,反面?此时我将y = 100*1 乘以transpose of log(g) that is a 1*1001 and causes a 100*100 矩阵J. If I transpose y` 而不是log(g) 我会得到一个1*1 矩阵!

标签: matlab compiler-errors scalar objective-function


【解决方案1】:

我更改了以下代码行:

J = 1/m * ((-y * log(g)') - ((1 - y) * log(1 - g)'));

到以下代码行:

J = 1/m * (((-y)' * log(g)) - ((1 - y)' * log(1 - g)));

问题解决了! yg100*1 矩阵,使用以前的代码我有 J=100*100 矩阵,但使用新代码我有 J=1*1 矩阵或标量,问题解决了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    相关资源
    最近更新 更多