受到MNIST分类取得成功的鼓舞,我想解决一些神经网络的“实际”问题。 任务似乎很简单:
我们有:
我想训练一个具有1个输入(对于1个x值)和一个输出(对于1个y值)的网络。一个隐藏层。
这是我的基本程序:
将我的x值切成不同的批次(例如,每批次10个元素)
在每一批中计算网络的输出,然后应用反向传播,计算权重和偏差更新
每批次平均计算出的权重和偏差后,实际上会更新权重和偏差
重复步骤1.-3.多次
此过程对于MNIST效果很好,但是对于回归而言,它完全失败。 我想知道我是否做错了什么。 我尝试了不同的批处理大小,直到对所有x个值取平均值。
基本上,网络训练得不好。手动调整权重和偏差(带有2个隐藏的神经元)后,我可以很好地近似y = f(x),但是当网络学习参数时,它将失败。
当我只有一个用于x的元素和一个用于y的元素并且我训练网络时,它对于这一对特定的对象训练得很好。
也许有人对我有暗示。我是否会误解神经网络的回归?
到目前为止,我认为代码本身还可以,因为它适用于MNIST,并且适用于“一对x / y对示例”。我宁愿认为我的总体方法(参见上文)可能不适合回归。
谢谢
吉姆
ps:我明天要发布一些代码...
下面是代码(MATLAB)。就像我说的,它是一个隐藏的层,带有两个隐藏的神经元:
% init hyper-parameters
hidden_neurons=2;
input_neurons=1;
output_neurons=1;
learning_rate=0.5;
batchsize=50;
% load data
training_data=d(1:100)/100;
training_labels=v_start(1:100)/255;
% init weights
init_randomly=1;
if init_randomly
% initialize weights and bias with random numbers between -0.5 and +0.5
w1=rand(hidden_neurons,input_neurons)-0.5;
b1=rand(hidden_neurons,1)-0.5;
w2=rand(output_neurons,hidden_neurons)-0.5;
b2=rand(output_neurons,1)-0.5;
else
% initialize with manually determined values
w1=[10;-10];
b1=[-3;-0.5];
w2=[0.2 0.2];
b2=0;
end
for epochs =1:2000 % looping over some epochs
for i = 1:batchsize:length(training_data) % slice training data into batches
batch_data=training_data(i:min(i+batchsize,length(training_data))); % generating training batch
batch_labels=training_labels(i:min(i+batchsize,length(training_data))); % generating training label batch
% initialize weight updates for next batch
w2_update=0;
b2_update =0;
w1_update =0;
b1_update =0;
for k = 1: length(batch_data) % looping over one single batch
% extract trainig sample
x=batch_data(k); % extracting one single training sample
y=batch_labels(k); % extracting expected output of training sample
% forward pass
z1 = w1*x+b1; % sum of first layer
a1 = sigmoid(z1); % activation of first layer (sigmoid)
z2 = w2*a1+b2; % sum of second layer
a2=z2; %activation of second layer (linear)
% backward pass
delta_2=(a2-y); %calculating delta of second layer assuming quadratic cost; derivative of linear unit is equal to 1 for all x.
delta_1=(w2'*delta_2).* (a1.*(1-a1)); % calculating delta of first layer
% calculating the weight and bias updates averaging over one
% batch
w2_update = w2_update +(delta_2*a1') * (1/length(batch_data));
b2_update = b2_update + delta_2 * (1/length(batch_data));
w1_update = w1_update + (delta_1*x') * (1/length(batch_data));
b1_update = b1_update + delta_1 * (1/length(batch_data));
end
% actually updating the weights. Updated weights will be used in
% next batch
w2 = w2 - learning_rate * w2_update;
b2 = b2 - learning_rate * b2_update;
w1 = w1 - learning_rate * w1_update;
b1 = b1 - learning_rate * b1_update;
end
end
这是随机初始化的结果,显示预期的输出,训练之前的输出以及训练之后的输出: training with random init
有人可以说蓝线已经比黑线更近了,从这个意义上说,网络已经优化了结果。但是我不满意。 这是我手动调整的值的结果: training with pre-init
黑线对于两个隐藏的神经元来说还不错,但是我的期望是,这样的黑线是从随机初始化开始训练的结果。
任何建议我做错了什么? 谢谢!
答案 0 :(得分:1)
好吧,经过一些研究,我发现了一些有趣的观点:
最后,我打算在网络上学习的内容得到了令人信服的结果:)
答案 1 :(得分:0)