[英]Neural Network Cost Function in MATLAB
我如何在matlab中实现这个神经网络成本函数:
以下是符号代表的含义:
% m is the number of training examples. [a scalar number]
% K is the number of output nodes. [a scalar number]
% Y is the matrix of training outputs. [an m by k matrix]
% y^{(i)}_{k} is the ith training output (target) for the kth output node. [a scalar number]
% x^{(i)} is the ith training input. [a column vector for all the input nodes]
% h_{\theta}(x^{(i)})_{k} is the value of the hypothesis at output k, with weights theta, and training input i. [a scalar number]
%note: h_{\theta}(x^{(i)}) will be a column vector with K rows.
我遇到了嵌套和,偏置节点以及这个等式的一般复杂性的问题。 我也在苦苦挣扎,因为有两个权重矩阵,一个将输入连接到隐藏层,另一个连接隐藏层和输出。 到目前为止,这是我的尝试。
定义变量
m = 100 %number of training examples
K = 2 %number of output nodes
E = 2 %number of input nodes
A = 2 %number of nodes in each hidden layer
L = 1 %number of hidden layers
Y = [2.2, 3.5 %targets for y1 and y2 (see picture at bottom of page)
1.7, 2.1
1.9, 3.6
. . %this is filled out in the actual code but to save space I have used ellipsis. there will be m rows.
. .
. .
2.8, 1.6]
X = [1.1, 1.8 %training inputs. there will be m rows
8.5, 1.0
9.5, 1.8
. .
. .
. .
1.4, 0.8]
W1 = [1.3, . . 0.4 %this is just an E by A matrix of random numbers. this is the matrix of initial weights.
. . . - 2
. . . 3.1
. . . - 1
2.1, -8, 1.2, 2.1]
W2 = [1.3, . . 0.4 %this is an A by K matrix of random numbers. this is the matrix of initial weights.
. . . - 2
. . . 3.1
. . . - 1
2.1, -8, 1.2, 2.1]
使用这些权重的假设等于......
Htheta = sigmf( dot(W2 , sigmf(dot(W1 , X))) ) %This will be a column vector with K rows.
使用这些权重的成本函数等于...(这是我在努力的地方)
sum1 = 0
for i = 1:K
sum1 = sum1 + Y(k,i) *log(Htheta(k)) + (1 - Y(k,i))*log(1-Htheta(k))
我只是继续写这样的事情,然后意识到这一切都是错的。 我不能为我的生活弄清楚如何做嵌套的总和,或包括输入矩阵,或做任何一个。 这一切都非常复杂。
我如何在matlab中创建这个等式?
非常感谢你!
具有2个输入,2个输出,2个隐藏节点和2个偏置单元的2层神经网络http://imagizer.imageshack.us/v2/320x240q90/40/92bn.jpg
注意:代码有奇怪的颜色,因为stackoverflow不知道我在MATLAB中编程。 我还将代码直接写入stackoverflow,因此它可能有语法错误。 我对如何进行此操作的一般概念更感兴趣,而不仅仅是复制和粘贴代码。 这就是我没有打过半冒号等原因的原因。
我使用与你上面提到的相同的错误函数实现了神经网络。 不幸的是,我还没有使用过Matlab很长一段时间,但我对Octave非常熟练,希望你仍然可以找到有用的东西,因为Octave中的许多函数都与Matlab类似。
@sashkello为计算成本函数提供了很好的代码片段。 但是,这段代码是用循环结构编写的,我想提供一个矢量化实现。
为了评估当前的θ值,我们需要在整个网络中执行前馈/ forward propagation
。 我假设你知道如何编写前馈代码,因为你只关心J(theta)
错误。 让代表前向传播结果的向量为F
一旦你执行了前馈,你就需要执行这个等式。 注意,我是以矢量化的方式实现它。
J = (-1/m) * sum(sum(Y .* log(F) + (1-Y) .* log(1-F),2));
这将计算有关的总和部分:
现在我们必须添加正则化术语,即:
通常情况下,我们会有任意数量的θ矩阵,但在这种情况下我们有2个,所以我们可以只执行几个求和:
J =J + (lambda/(2*m)) * (sum(sum(theta_1(:,2:end).^2,2)) + sum(sum(theta_2(:,2:end).^2,2)));
请注意,在每个总和中,我只是从第二列到其余部分工作。 这是因为第一列将对应于我们为“偏置单位”训练的theta
值。
所以有一个J的计算的矢量化实现。
我希望这有帮助!
我认为Htheta
是K * 2阵列。 请注意,您需要在远期成本函数计算中添加偏差( x0
和a0
)。 假设您在输入,隐藏和输出层有两个节点作为代码中的注释,我向您展示了每个步骤中的数组维度。
m = size(X, 1);
X = [ones(m,1) X]; % m*3 in your case
% W1 2*3, W2 3*2
a2 = sigmf(W1 * X'); % 2*m
a2 = [ones(m,1) a2']; % m*3
Htheta = sigmf(a2 * W2); % m*2
J = (1/m) * sum ( sum ( (-Y) .* log(Htheta) - (1-Y) .* log(1-Htheta) ));
t1 = W1(:,2:size(W1,2));
W2 = W2';
t2 = W2(:,2:size(W2,2));
% regularization formula
Reg = lambda * (sum( sum ( t1.^ 2 )) + sum( sum ( t2.^ 2 ))) / (2*m);
好吧,据我所知,你的问题与神经网络无关,但基本上问如何在matlab中进行嵌套求和。 我真的不想输入上面的整个等式,但是,即第一个总和的第一部分将如下所示:
Jtheta = 0
for i=1:m,
for j=1:K,
Jtheta = Jtheta + Y(i, j) * log(Htheta(X(i))(j))
end
end
Jtheta
是你的结果。
这适用于任意数量的隐藏层:
% Allow arbitrary network architectures. Create cell array of all Theta parameters
Theta={Theta1; Theta2};
% Compute unregularised cost (J)
J = 1/m * sum(sum((-y .* log(hX) - (1 - y) .* log(1 - hX))));
% Add regularisation
for i = 1:length(Theta)
J += lambda / 2 / m * sum(sum(Theta{i}(:,2:end) .^ 2));
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.