成本函数最小值太低

问题描述 投票:0回答:1

下面是我正在尝试编写的神经网络的 Matlab 代码的一部分。这是我第一次尝试与机器学习相关的事情。我在这里关注迈克尔·尼尔森的书:http://neuralnetworksanddeeplearning.com/chap2.html

我正在加载一组带有标签的 60000 个 28x28 手写数字灰度图像,并尝试训练这个神经网络来识别它们。还有一个10000张图像的测试数据集。该网络有 784 个输入神经元 (28^2),两个隐藏层,每个隐藏层有 16 个神经元,输出层有 10 个神经元。我将权重和偏差初始化为 -0.5 到 0.5 之间的随机值。

我将成本函数评估为 C = 0.5*(a-y).^2。它似乎比较成功,因为它从 C=1.35 开始,到 C=0.46 结束,然后基本趋于平缓(大约 75 个时期)。然而,错误仍然足够高,它只能在 12% 的时间内猜到正确的数字,这几乎是随机的。我已经对数学进行了两次和三次检查,但找不到错误。我想一定有一个我没有看到的。下面的代码是主训练循环中的所有内容,因此任何错误都应该在那里。我不会将图像分成更小的批次,而是在每个时期一次处理整个 60k 图像。由于每个图像只有 28x28 像素,因此速度足够快,不会将其分解。输入神经元 a_0 是一个 784x60000 双精度数组,值在 0 到 1 之间。我获取了原始图像,其中每个像素都是 uint8,并将其转换为双精度,然后除以 255 得到 a_0。我对代码中的层进行编号,第 0 层是输入层,第 1 层和第 2 层是隐藏层,第 3 层是输出层。

a_0 = training_images;
epoch = 0;
while epoch < 5 || C(epoch - 1) - C(epoch) > 0.001    
epoch = epoch + 1;

%Propagate forwards
z_1 = weights_1*a_0 + biases_1;
a_1 = sigmoid(z_1);
z_2 = weights_2*a_1 + biases_2;
a_2 = sigmoid(z_2);
z_3 = weights_3*a_2 + biases_3;
a_3 = sigmoid(z_3);

%Evaluate cost function
C(epoch) = 0.5*mean(sum((a_3-y).^2, 1));

%Propagate backwards
sigmoid_d1 = a_1 .* (1-a_1); %Sigmoid derivative
sigmoid_d2 = a_2 .* (1-a_2);
sigmoid_d3 = a_3 .* (1-a_3);
delta_3 = (a_3-y).*sigmoid_d3;
delta_2 = weights_3.'*delta_3 .* sigmoid_d2;
delta_1 = weights_2.'*delta_2 .* sigmoid_d1;

%Calculate gradient
for image_index = 1:num_images
    dC_dw3(:, :, image_index) = delta_3(:, image_index) * a_2(:, image_index).';
    dC_dw2(:, :, image_index) = delta_2(:, image_index) * a_1(:, image_index).';
    dC_dw1(:, :, image_index) = delta_1(:, image_index) * a_0(:, image_index).';
end

%Calculate adjustment
training_rate = 0.1;
adjust_biases_1 = -training_rate * mean(delta_1, 2);
adjust_biases_2 = -training_rate * mean(delta_2, 2);
adjust_biases_3 = -training_rate * mean(delta_3, 2);
adjust_weights_1 = -training_rate * mean(dC_dw1, 3);
adjust_weights_2 = -training_rate * mean(dC_dw2, 3);
adjust_weights_3 = -training_rate * mean(dC_dw3, 3);
biases_1 = biases_1 + adjust_biases_1;
biases_2 = biases_2 + adjust_biases_2;
biases_3 = biases_3 + adjust_biases_3;
weights_1 = weights_1 + adjust_weights_1;
weights_2 = weights_2 + adjust_weights_2;
weights_3 = weights_3 + adjust_weights_3;
matlab machine-learning deep-learning neural-network
1个回答
0
投票

我找到了答案。没有错误,但我严重低估了我需要的训练时间。我认为因为成本函数趋于平缓,所以它已经达到了收益递减的地步。通过几个小时的训练,我能够突破平台期,成本又开始迅速下降。我还需要显着提高训练率,分批运行可以显着提高性能。

© www.soinside.com 2019 - 2024. All rights reserved.