好的,所以我正处于Andrew Ng关于课程的机器学习课程的中间,并且想要调整作为任务4的一部分完成的神经网络.
特别是,我作为任务的一部分正确完成的神经网络如下:
Sigmoid激活功能: g(z) = 1/(1+e^(-z))
10个输出单位,每个单位可以取0或1
1个隐藏层
用于最小化成本函数的反向传播方法
成本函数:
其中L=number of layers
,s_l = number of units in layer l
,m = number of training examples
,K = number of output units
现在我想调整练习,以便有一个连续的输出单元,在[0,1]之间取任何值,我正在尝试找出需要改变的东西,到目前为止我有
用我自己的数据替换数据,即输出是0到1之间的连续变量
更新了对输出单元数的引用
将反向传播算法中的成本函数更新为:
其中a_3
是从前向传播确定的输出单位的值.
我确信其他必须改变,因为梯度检查方法显示由反向传播确定的梯度,并且数值近似不再匹配.我没有改变sigmoid梯度; 则留在f(z)*(1-f(z))
其中f(z)
是S形函数1/(1+e^(-z)))
,也没有我更新衍生物式的数值近似; 简单(J(theta+e) - J(theta-e))/(2e)
.
任何人都可以建议需要采取哪些其他步骤?
在Matlab中编码如下:
% FORWARD PROPAGATION % input layer a1 = [ones(m,1),X]; % hidden layer z2 = a1*Theta1'; a2 = sigmoid(z2); a2 = [ones(m,1),a2]; % output layer z3 = a2*Theta2'; a3 = sigmoid(z3); % BACKWARD PROPAGATION delta3 = a3 - y; delta2 = delta3*Theta2(:,2:end).*sigmoidGradient(z2); Theta1_grad = (delta2'*a1)/m; Theta2_grad = (delta3'*a2)/m; % COST FUNCTION J = 1/(2 * m) * sum( (a3-y).^2 ); % Implement regularization with the cost function and gradients. Theta1_grad(:,2:end) = Theta1_grad(:,2:end) + Theta1(:,2:end)*lambda/m; Theta2_grad(:,2:end) = Theta2_grad(:,2:end) + Theta2(:,2:end)*lambda/m; J = J + lambda/(2*m)*( sum(sum(Theta1(:,2:end).^2)) + sum(sum(Theta2(:,2:end).^2)));
我已经意识到这个问题类似于@Mikhail Erofeev在StackOverflow上提出的问题,但是在这种情况下我希望连续变量介于0和1之间,因此使用sigmoid函数.