如何实现带有隐藏层的neural网络?

我正在尝试训练一个具有3个输入和1个输出的神经网络(包括输入层、一个隐藏层和输出层),用于在MATLAB中对二次方程进行分类。我试图实现前馈阶段,$x_i^{out}=f(s_i)$,$s_i={\sum}_{\substack{j\\}} w_{ij}x_j^{in}$,反向传播${\delta}_j^{in}=f'(s_i){\sum}_{\substack{j\\}} {\delta}_i^{out}w_{ij}$以及更新$w_{ij}^{new}=w_{ij}^{old}-\epsilon {\delta}_i^{out}x_j^{in}$,其中$x$是输入向量,$w$是权重,$\epsilon$是学习率。

我在编码隐藏层和添加激活函数$f(s)=tanh(s)$时遇到了麻烦,因为网络输出的误差似乎没有减少。有人能指出我实现的错误之处吗?

输入是二次方程$ax^2 + bx + c = 0$的实系数,输出应为正值如果二次方程有两个实根,反之则为负值。

nTrain = 100; % 训练集大小
nOutput = 1;
nSecondLayer = 7; % 隐藏层大小(任意)
trainExamples = rand(4,nTrain); % 独立的随机示例集
trainExamples(4,:) = ones(1,nTrain);  % 将虚拟输入设为1
T = sign(trainExamples(2,:).^2-4*trainExamples(1,:).*trainExamples(3,:)); % 教师为每个示例提供此值
% 学生神经元从随机权重开始
w1 = rand(4,nSecondLayer);
w2 = rand(nSecondLayer,nOutput);
nepochs=0;
nwrong = 1;
S1(nSecondLayer,nTrain) = 0;
S2(nOutput,nTrain) = 0;
while( nwrong>1e-2 )  % 大于接近零的某个小数
    for i=1:nTrain
        x = trainExamples(:,i);
        S2(:,i) = w2'*S1(:,i);
        deltak = tanh(S2(:,i)) - T(:,i); % 反向传播
        deltaj = (1-tanh(S2(:,i)).^2).*(w2*deltak); % 反向传播
        w2 = w2 - tanh(S1(:,i))*deltak'; % 更新
        w1 = w1- x*deltaj'; % 更新
    end
    output = tanh(w2'*tanh(w1'*trainExamples));
    dOutput = output-T;
    nwrong = sum(abs(dOutput));
    disp(nwrong)
    nepochs = nepochs+1
end
nepochs

谢谢


回答:

经过几天不断尝试后,我发现了一个小小的打字错误。以下是工作解决方案:

clear
% 设置参数
nInput = 4; % 输入节点数
nOutput = 1; % 输出节点数
nHiddenLayer = 7; % 隐藏层节点数
nTrain = 1000; % 训练集大小
epsilon = 0.01; % 学习率
% 设置输入:-1到1之间的随机系数
trainExamples = 2*rand(nInput,nTrain)-1;
trainExamples(nInput,:) = ones(1,nTrain);  % 将最后一个输入设为1
% 为隐藏层和输出层设置学生神经元
S1(nHiddenLayer,nTrain) = 0;
S2(nOutput,nTrain) = 0;
% 学生神经元从输入和隐藏层的随机权重开始
w1 = rand(nInput,nHiddenLayer);
w2 = rand(nHiddenLayer+1,nOutput);
% 根据二次公式计算教师输出
T = sign(trainExamples(2,:).^2-4*trainExamples(1,:).*trainExamples(3,:));
% 初始化循环值
nEpochs = 0;
nWrong = nTrain*0.01;
Wrong = [];
Epoch = [];
while(nWrong >= (nTrain*0.01)) % 只要超过1%的输出错误
    for i=1:nTrain
        x = trainExamples(:,i);
        S1(1:nHiddenLayer,i) = w1'*x;
        S2(:,i) = w2'*[tanh(S1(:,i));1];
        delta1 = tanh(S2(:,i)) - T(:,i); % 反向传播
        delta2 = (1-tanh(S1(:,i)).^2).*(w2(1:nHiddenLayer,:)*delta1); % 反向传播
        w1 = w1 - epsilon*x*delta2'; % 更新
        w2 = w2 - epsilon*[tanh(S1(:,i));1]*delta1'; % 更新
    end
    outputNN = sign(tanh(S2));
    delta = outputNN - T; % 学生与教师之间的差异
    nWrong = sum(abs(delta/2));
    nEpochs = nEpochs + 1;
    Wrong = [Wrong nWrong];
    Epoch = [Epoch nEpochs];
end
plot(Epoch,Wrong);

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注