我正在使用 Matlab( github 代码库)。网络详细信息如下:
隐藏单位:100(可变)
时代:500
- 批量:100
权重正在使用反向传播算法进行更新。
我已经能够识别我在 Photoshop 中绘制的 0,1,2,3,4,5,6,8。
然而 7,9 无法识别,但在测试集上运行时,我只得到 749/10000 错误,它正确分类了 9251/10000。
知道可能出了什么问题吗?因为它正在学习,并且基于测试集的结果,它的学习是正确的。
我正在使用 Matlab( github 代码库)。网络详细信息如下:
隐藏单位:100(可变)
时代:500
权重正在使用反向传播算法进行更新。
我已经能够识别我在 Photoshop 中绘制的 0,1,2,3,4,5,6,8。
然而 7,9 无法识别,但在测试集上运行时,我只得到 749/10000 错误,它正确分类了 9251/10000。
知道可能出了什么问题吗?因为它正在学习,并且基于测试集的结果,它的学习是正确的。
我在您的代码中没有看到任何完全不正确的地方,但是有很多可以改进的地方:
您可以使用它来设置初始权重:
hiddenWeights = rand(hiddenUnits,inputVectorSize);
outputWeights = rand(outputVectorSize,hiddenUnits);
hiddenWeights = hiddenWeights./size(hiddenWeights, 2);
outputWeights = outputWeights./size(outputWeights, 2);
我认为这会使你的体重非常小。不仅如此,您将没有负值,因此您将丢弃 sigmoid 值范围的一半。我建议你试试:
weights = 2*rand(x, y) - 1
这将在[-1, 1]
. 然后,您可以尝试划分此间隔以获得更小的权重(尝试除以大小的 sqrt)。
您将其用作输出增量:
outputDelta = dactivation(outputActualInput).*(outputVector - targetVector) % (tk-yk)*f'(yin)
如果使用平方损失函数,则乘以导数。对于日志损失(通常用于分类),您应该只有outputVector - targetVector
. 它可能没有那么大的不同,但你可能想尝试一下。
你在评论中说网络没有检测到你自己的七分之一和九分。这可能表明对 MNIST 数据的过度拟合。为了解决这个问题,您需要在网络中添加某种形式的正则化:权重衰减或 dropout。
如果您还没有尝试过,您也应该尝试不同的学习率。
你似乎没有任何偏置神经元。除输出层外,每一层都应该有一个只将值返回1
到下一层的神经元。您可以通过向您的输入数据添加另一个特性来实现这一点,该特性始终是1
.
MNIST 是一个大数据集,目前仍在研究更好的算法。你的网络非常基础,很小,没有正则化,没有偏置神经元,也没有对经典梯度下降的改进。它运行得不太好也就不足为奇了:您可能需要一个更复杂的网络才能获得更好的结果。