matlab - 为什么我的神经网络在 MNIST 数据集上训练后无法正确预测 7 和 9?

标签 matlab machine-learning neural-network image-recognition mnist

我正在使用 Matlab (github code repository)。网络的详细信息是:

  • 隐藏单位:100(可变)

  • 纪元:500

  • 批量大小:100

权重正在使用反向传播算法进行更新。

我已经能够识别我在 Photoshop 中绘制的 0,1,2,3,4,5,6,8。

然而,7,9 未被识别,但在测试集上运行时,我只得到 749/10000 错误,并且它正确分类了 9251/10000。

知道可能出了什么问题吗?因为它正在学习并且基于测试集,所以它的学习正确。

最佳答案

我在您的代码中没有发现任何完全错误的地方,但还有很多可以改进的地方:

  1. 您可以使用它来设置初始权重:

    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)。

  2. 您使用它作为输出增量:

    outputDelta = dactivation(outputActualInput).*(outputVector - targetVector) % (tk-yk)*f'(yin)
    

    如果使用平方损失函数,则乘以导数即可。对于对数损失(通常用于分类),您应该只有 outputVector - targetVector。这可能不会产生那么大的影响,但你可能想尝试一下。

  3. 您在评论中说网络无法检测到您自己的七七八八。这可能表明 MNIST 数据过度拟合。为了解决这个问题,您需要向网络添加某种形式的正则化:权重衰减或丢失。

  4. 如果您还没有尝试过,您也应该尝试不同的学习率。

  5. 你似乎没有任何偏见神经元。除输出层外,每一层都应该有一个仅将值 1 返回到下一层的神经元。您可以通过向输入数据添加另一个始终为 1 的功能来实现此目的。

MNIST 是一个大数据集,仍在研究更好的算法。您的网络非常基本,很小,没有正则化,没有偏差神经元,也没有对经典梯度下降的改进。它运行得不太好并不奇怪:您可能需要更复杂的网络才能获得更好的结果。

关于matlab - 为什么我的神经网络在 MNIST 数据集上训练后无法正确预测 7 和 9?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32565438/

相关文章:

python-3.x - 属性错误: 'str' object has no attribute 'flow_from_directory'

matlab - 为什么从 'trapz' 出来的向量函数为 NAN?

regex - 使用 % 查找注释,使用正则表达式将 printf 与 %d 结合使用

matlab - 错误栏的不同颜色 Matlab 2014b

matlab - Mnist数据集模式识别准确率

python - 将 CountVectorizer 中的稀疏矩阵添加到数据框中,并提供分类器的免费信息 - 保持稀疏格式

python - 评估期间 Experimenter 中的 tensorflow 混淆矩阵

python - 神经网络精度优化

python - 如何使Keras网络不输出全1

java - m 文件(使用 matlab2014a)到 jar 文件转换不起作用