为什么我在 MNIST 数据集上训练的神经网络不能正确预测 7 和 9?
Why does my neural network trained on MNIST data set not predict 7 and 9 correctly?
我正在使用 Matlab ( github code repository )。网络详情为:
隐藏单位:100(变量)
纪元:500
- 批量大小:100
正在使用反向传播算法更新权重。
我已经能够识别我在 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]
中生成随机数。然后您可以尝试除以该间隔以获得更小的权重(尝试除以大小的平方)。
您将其用作输出增量:
outputDelta = dactivation(outputActualInput).*(outputVector - targetVector) % (tk-yk)*f'(yin)
如果使用平方损失函数,则乘以导数即可。对于对数损失(通常用于分类),你应该只有 outputVector - targetVector
。这可能不会有太大的不同,但您可能想尝试一下。
你在评论中说网络没有检测到你自己的七和九。这可能表明 MNIST 数据过度拟合。要解决这个问题,您需要在网络中添加某种形式的正则化:权重衰减或丢失。
你也应该尝试不同的学习率,如果你还没有的话。
你似乎没有任何偏见神经元。每一层,除了输出层,都应该有一个只returns值1
到下一层的神经元。您可以通过向始终为 1
.
的输入数据添加另一个功能来实现此目的
MNIST 是一个大数据集,仍在研究更好的算法。您的网络非常基础,很小,没有正则化,没有偏置神经元,也没有对经典梯度下降法进行改进。它运行不佳并不奇怪:您可能需要更复杂的网络才能获得更好的结果。
与神经网络或您的代码无关,
但是这张 KNN 最近数字的图片显示一些 MNIST 数字
简直难以辨认:
我正在使用 Matlab ( github code repository )。网络详情为:
隐藏单位:100(变量)
纪元:500
- 批量大小:100
正在使用反向传播算法更新权重。
我已经能够识别我在 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]
中生成随机数。然后您可以尝试除以该间隔以获得更小的权重(尝试除以大小的平方)。您将其用作输出增量:
outputDelta = dactivation(outputActualInput).*(outputVector - targetVector) % (tk-yk)*f'(yin)
如果使用平方损失函数,则乘以导数即可。对于对数损失(通常用于分类),你应该只有
outputVector - targetVector
。这可能不会有太大的不同,但您可能想尝试一下。你在评论中说网络没有检测到你自己的七和九。这可能表明 MNIST 数据过度拟合。要解决这个问题,您需要在网络中添加某种形式的正则化:权重衰减或丢失。
你也应该尝试不同的学习率,如果你还没有的话。
你似乎没有任何偏见神经元。每一层,除了输出层,都应该有一个只returns值
1
到下一层的神经元。您可以通过向始终为1
. 的输入数据添加另一个功能来实现此目的
MNIST 是一个大数据集,仍在研究更好的算法。您的网络非常基础,很小,没有正则化,没有偏置神经元,也没有对经典梯度下降法进行改进。它运行不佳并不奇怪:您可能需要更复杂的网络才能获得更好的结果。
与神经网络或您的代码无关, 但是这张 KNN 最近数字的图片显示一些 MNIST 数字 简直难以辨认: