在 MATLAB 中从头开始编程基本神经网络

Posted

技术标签:

【中文标题】在 MATLAB 中从头开始编程基本神经网络【英文标题】:Programming a Basic Neural Network from scratch in MATLAB 【发布时间】:2014-03-26 18:40:42 【问题描述】:

我过去在这个网站上问过一些关于神经网络的问题,并得到了很好的答案,但我仍在努力为自己实现一个。这是一个相当长的问题,但我希望它可以作为其他人在 MATLAB 中创建自己的基本神经网络的指南,所以它应该是值得的。

到目前为止我所做的可能是完全错误的。我正在学习 Andrew Y. Ng 教授的在线斯坦福机器学习课程,并尽我所能将他所教的内容付诸实践。

您能否告诉我我的代码的前馈和成本函数部分是否正确,以及我在最小化(优化)部分中哪里出错了?

我有一个 feed 2 层前馈神经网络。

前馈部分的 MATLAB 代码为:

function [ Y ] = feedforward2( X,W1,W2)
%This takes a row vector of inputs into the neural net with weight matrices W1 and W2 and returns a row vector of the outputs from the neural net

%Remember X, Y, and A can be vectors, and W1 and W2 Matrices 

X=transpose(X);            %X needs to be a column vector
A = sigmf(W1*X,[1 0]);     %Values of the first hidden layer  
Y = sigmf(W2*A,[1 0]);     %Output Values of the network
Y = transpose(Y);          %Y needs to be a column vector

例如,具有两个输入和两个输出的两层神经网络看起来有点像这样:

      a1
x1 o--o--o y1      (all weights equal 1)
    \/ \/
    /\ /\
x2 o--o--o y2
      a2

如果我们输入:

X=[2,3];
W1=ones(2,2);
W2=ones(2,2);

Y = feedforward2(X,W1,W2)

我们得到输出:

Y = [0.5,0.5]

这表示神经网络图中显示的y1和y2值

平方误差成本函数的 MATLAB 代码为:

function [ C ] = cost( W1,W2,Xtrain,Ytrain )
%This gives a value seeing how close W1 and W2 are to giving a network that represents the Xtrain and Ytrain data
%It uses the squared error cost function
%The closer the cost is to zero, the better these particular weights are at giving a network that represents the training data
%If the cost is zero, the weights give a network that when the Xtrain data is put in, The Ytrain data comes out

M = size(Xtrain,1);  %Number of training examples

oldsum = 0;

for i = 1:M,
        H = feedforward2(Xtrain,W1,W2); 
        temp = ( H(i) - Ytrain(i) )^2;
        Sum = temp + oldsum;
        oldsum = Sum;
end

C = (1/2*M) * Sum;

end

示例

例如,如果训练数据是:

Xtrain =[0,0;        Ytrain=[0/57;
        1,2;           3/57;
        4,1;           5/57;
        5,2;           7/57;                                                           a1    
        3,4;           7/57;    %This will be for a two input one output network  x1 o--o y1
        5,3;           8/57;                                                          \/ \_o 
        1,5;           6/57;                                                          /\ /
        6,2;           8/57;                                                      x2 o--o      
        2,1;           3/57;                                                           a2    
        5,5;]          10/57;]

我们从初始随机权重开始

W1=[2,3;     W2=[3,2]
    4,1]

如果我们输入:

Y= feedforward2([6,2],W1,W2)

我们得到

Y = 0.9933 

这与训练数据所说的相差甚远(8/57 = 0.1404)。所以最初的随机权重 W1 和 W2 在那里一个不好的猜测。

为了准确衡量对随机权重的猜测有多差/多好,我们使用成本函数:

C= cost(W1,W2,Xtrain,Ytrain)

这给出了值:

C = 6.6031e+003

最小化成本函数

如果我们通过搜索所有可能的变量 W1 和 W2 来最小化成本函数,然后选择最低的,这将给出最接近训练数据的网络

但是当我使用代码时:

 [W1,W2]=fminsearch(cost(W1,W2,Xtrain,Ytrain),[W1,W2])

它给出一条错误消息。它说:“使用 horzcat 时出错。CAT 参数尺寸不一致。”为什么会出现此错误,我该如何解决?


您能否告诉我我的代码的前馈和成本函数部分是否正确,以及我在最小化(优化)部分中哪里出错了?

谢谢!!!

【问题讨论】:

【参考方案1】:

您的神经网络似乎还不错,但如果您正在针对标记数据进行训练,那么您尝试进行的训练效率非常低。在这种情况下,我建议调查Back-propagation

关于你在训练时的错误:你的错误信息提示问题:dimensions are not consistent

作为 fminsearch 中的参数 x0 是优化器的初始猜测,您发送 [W1, W2] 但据我所知,这些矩阵的行数不同,因此您可以不要像那样把它们加在一起。我建议修改您的成本函数以将向量作为参数,然后从该向量形成不同层的权重向量。

您也没有正确地向fminsearch 提供成本函数,因为您只是在就地使用 w1、w2、Xtrain 和 Ytrain 评估 cost

根据documentation(我使用 Matlab 已经多年了),您似乎将 指向成本函数的指针 传递为 fminsearch(cost, [W1; W2])

编辑:您可以按如下方式表达您的权重并修改您的代码:

global Xtrain
global Ytrain
W = [W1; W2]
fminsearch(cost, W)

必须修改成本函数,使其不接受 Xtrain、Ytrain 作为输入,因为 fminsearch 将尝试优化它们。像这样修改你的成本函数:

function [ C ] = cost( W )
   W1 = W[1:2,:]
   W2 = W[3,:]
   global Xtrain
   global Ytrain
   ...

【讨论】:

感谢您的回答。 “修改您的成本函数以将向量作为参数,然后从该向量形成不同层的权重向量。”我该怎么做?我不知道如何从一个和变为一个向量方程,我不明白你所说的“从那个向量形成不同层的权重向量”是什么意思。

以上是关于在 MATLAB 中从头开始编程基本神经网络的主要内容,如果未能解决你的问题,请参考以下文章

让一个简单的神经网络在 C++ 中从头开始工作

从头开始的神经网络 - 预测单个示例

可以使用深度学习框架而不是从头开始构建神经网络吗?

python 神经网络的实现。参考:[在Python中从头开始实现神经网络 - 简介](http://www.wildml.c

Matlab卷积神经网络(CNN)手写数字识别

从头开始训练 Resnet 深度神经网络