qq458138584
2017-11-24 12:10
采纳率: 100%
浏览 3.0k

神经网络小白问题:训练误差太大,是程序写错了么???

小白刚学神经网络,自编码,反向传播训练。
一个隐含层,一个输出层。输入与输出n相等
训练一个样本,
比如 【0.1 ,0.2,0.3,0.4】能拟合

但是训练一个矩阵,输入多个样本,拟合后的矩阵误差太大了,,是我的程序写错了么?不应该呀。
比如随便输入一个矩阵

0.1000    0.9000    0.9000    0.1000
0.5000    0.6000    0.6000    0.5000

输出结果就非常差:

  0.2928    0.7560    0.7560    0.2929
  0.3026    0.7467    0.7465    0.3023

想想也是,第一行与第二行没有关系,训练都要照顾,肯定拟合不好,

神经网络是这么用的么???
还是说数据特征要多一些???
真是难受,求大神开导,是我写错了,还是神经网络不能这么用?

matlab代码如下

mat=load("mat.txt")
[m,n]=size(mat);

visible_num=n;
hidden_num=3;

out=partial2(mat,visible_num,hidden_num);
out
mat

function [out]=partial2(mat,visible_num,hidden_num)
[m,n]=size(mat);
alpha=0.1;
W2=normrnd(0,0.1,hidden_num,visible_num);
W3=normrnd(0,0.1,visible_num,hidden_num);
b2=normrnd(0,0.1,[hidden_num,1]);
b3=normrnd(0,0.1,[visible_num,1]);
%b2=zeros(hidden_num,1);
%b3=zeros(visible_num,1);
it=1000;
out=0;
for j=1:it

    W2_grad=zeros(hidden_num,visible_num);
    W3_grad=zeros(visible_num,hidden_num);
    b2_grad=zeros(hidden_num,1);
    b3_grad=zeros(visible_num,1);

        for i=1:m
            z2=W2*mat(i,:)'+b2;
            a2=sigmod(z2);
            z3=W3*a2+b3;
            a3=sigmod(z3);

            t3=-(mat(i,:)'-a3).*(a3.*(1-a3));
            t2=W3'*t3.*(a2.*(1-a2));
            W3_grad=W3_grad+t3*a2';           
            W2_grad=W2_grad+t2*mat(i,:);
            b3_grad=b3_grad+t3;
            b2_grad=b2_grad+t2;
        end
    W3_grad=(W3_grad./m).*alpha;
    W2_grad=(W2_grad./m).*alpha;
    b2_grad=b2_grad./m.*alpha;
    b3_grad=b3_grad./m.*alpha;
    W2=W2-W2_grad;
    W3=W3-W3_grad;
    b2=b2-b2_grad;
    b3=b3-b3_grad;

    z2=W2*mat'+b2;
    a2=sigmod(z2);
    z3=W3*a2+b3;
    a3=sigmod(z3);   
    err2=sum(sum(abs(mat(i,:)'-a3)))
    out=a3';
end
end
function [ x ] = sigmod( x )
x=1./(1+exp(-x));
end

图片说明

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • Debug_dodge 2017-11-24 12:47
    已采纳

    输出每步的loss试试,看到底有没有下降

    点赞 评论

相关推荐 更多相似问题