小白刚学神经网络,自编码,反向传播训练。
一个隐含层,一个输出层。输入与输出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