神经网络只学习最常见的训练图像

Neural network only learns most common training image

我正在使用 TensorFlow 和 Python 构建神经网络,并使用 Kaggle 'First Steps with Julia' 数据集对其进行训练和测试。训练图像基本上是一组从 Google 街景、街道标志、商店名称等中挑选出的不同数字和字母的图像。该网络有 2 个完全连接的隐藏层。

我遇到的问题是网络会很快训练自己只返回一个答案:最常见的训练字母(在我的例子中 'A')。输出采用 (62, 1) 概率向量的形式,每个数字和字母(大写和小写)对应一个。该向量对于所有输入图像完全相同。

然后我尝试从我的输入数据中删除所有 'A's,此时网络更改为仅返回下一个最常见的输入类型('E') .

那么,有什么方法可以阻止我的网络停在局部最小值(不确定这是否是实际术语)?这甚至是神经网络的普遍问题,还是只是我的网络以某种方式损坏?

如果有帮助,我很乐意提供代码。

编辑:这些是我的网络的超参数:

输入大小:400(20x20 灰度图像)
隐藏层 1 大小:100
隐藏层 2 大小:100
输出层大小:62(字母数字,小写和大写)

训练数据大小:4283 张图片
验证数据大小:1000 张图片
测试数据大小:1000 张图片

批量大小:100
学习率:0.5
辍学率:0.5
L2正则化参数:0

你的学习率太高了。它应该在 0.01 左右,您可以围绕它进行试验,但是 0.5 太高了。

学习率高时,网络可能会卡在某个配置中并输出固定的内容,就像您观察到的那样。


编辑

看来真正的问题是数据集中的 class 不平衡。你可以试试:

  • 改变损失,使不太频繁的例子得到更高的损失
  • 通过使用平衡的数据批次来更改您的抽样策略。当 select 在你的批次中处理 64 个示例时,select 在数据集中随机出现,但每个 class.
  • 的概率相同

您使用的是哪个优化器?如果您只尝试过梯度下降,请尝试使用其中一种自适应方法(例如 adagrad/adadelta/adam)。

正在努力从石头中榨血!

我怀疑通过 4283 个训练示例,您的网络将学习 62 个类别...对于如此少量的数据,这是一个很大的要求。特别是因为您的网络不是转换网络......并且它被迫在第一层将其维度降低到 100。你不妨pca它,节省时间。

试试这个:
第 1 步:下载 MNIST 示例并学习如何训练和 运行 它。

第 2 步:使用相同的 mnist 网络设计并将您的数据投入其中……看看效果如何。您可能需要填充图像。在您的测试数据上进行训练,然后 运行。

现在第 3 步:通过继续使用您的数据(仅)进行训练并以较低的学习率持续几个时期(最终通过验证确定#epochs)。然后 运行 再次在您的测试数据上使用它,看看效果如何。为您的工具包查找 "transfer learning"...和 ​​"finetuning example"。(请注意,为了进行微调,您需要 mod 网络的输出层)

我不确定您的原始源图像有多大,但您可以调整它们的大小并在其上使用预训练的 cifar100 网络(微调),如果源图像足够大,甚至可以使用 imagenet。嗯 cifar/imagnet 用于彩色图像...但是您可以将灰度复制到每个 rgb 波段以获得乐趣。

记住我的话...这些步骤可能 "seem simple"...但是如果您可以通过微调您自己的数据来完成它并获得一些结果(即使它们不是很好的结果),您可以认为自己是一名体面的 NN 技术人员。

Caffe 网站上有一个很好的微调教程...flickr 风格(我认为)...TF 也应该有一个。

最后一步是设计您自己的 CNN...更改滤波器大小时要小心——您需要了解它如何影响每一层的输出以及信息如何 preserved/lost。

我想另一件事是 "data augmentation" 让自己多做一些。轻微 rotations/resizing/lighting...等等。 Tf 有一些很好的预处理来做这些……但有些需要你自己完成。

祝你好运!

恐怕这是菜鸟犯的错误。将数据从图像文件夹转换为单个 .pickle 文件时,我使用了:

  imageFileNames = os.listdir(folder)

获取该文件夹中的所有图像文件名。事实证明,这个 returns 文件名以 任意 顺序排列。这意味着我已将有序标签与随机图像匹配。

然后网络发现它能做的最好的事情就是让每个图像输入都有相同的输出向量,匹配最常见的训练图像,'A'。如果我从训练数据中取出所有 'A',它会对下一个最常见的训练图像做同样的事情 'E'。

故事的寓意:始终确保您的输入符合您的预期。只需目视检查一些以确保它们看起来正确。

非常感谢所有提供建议的人,我实际上从中学到了很多东西:-)