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

时间:2016-06-15 07:46:55

标签: python neural-network tensorflow

我正在使用TensorFlow和Python构建一个神经网络,并使用Kaggle'First Steps with Julia'数据集来训练和测试它。训练图像基本上是从街道视图,商店名称等中选取的不同数字和字母的一组图像。网络有2个完全连接的隐藏层。

我遇到的问题是,网络将很快训练自己只给出一个答案:最常见的培训信(在我的情况下是'A')。输出的形式为(62,1)概率向量,每个数字和字母一个(大小写)。对于所有输入图像,此向量完全相同。

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

那么,有没有办法阻止我的网络在本地最小值停止(不确定这是否是实际的术语)?这甚至是神经网络的一般问题,还是只是因为我的网络以某种方式被破坏了?

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

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

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

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

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

4 个答案:

答案 0 :(得分:2)

试图从石头上挤血!

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

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

第2步:使用相同的mnist网络设计并将数据丢给它......看看它是怎么回事。您可能需要填充图像。训练然后运行测试数据。

现在步骤3:采取训练有素的步骤1 mnist模型和#34;微调"它通过继续训练您的数据(仅)和较低的学习率几个时期(最终通过验证确定#epochs)。然后再次在测试数据上运行它,看看它是如何做的。查找"转移学习" ...以及"微调示例"对于你的工具包。(注意,对于微调,你需要修改网络的输出层)

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

标记我的话......这些步骤似乎很简单" ...但是如果你可以通过微调来完成它并得到一些结果(即使它们不是很好的结果)你自己的数据,你可以认为自己是一个体面的NN技术人员。

一个很好的微调教程是在Caffe网站上... flickr风格(我认为)......也必须是TF的一个。

最后一步是设计自己的CNN ...在更改过滤器大小时要小心 - 您需要了解它如何影响每个层的输出以及如何保留/丢失信息。

我想另外要做的事情是做数据增加"让自己更多。轻微旋转/调整大小/照明等等。 Tf有一些很好的预处理来做这些......但有些需要自己完成。

祝你好运!

答案 1 :(得分:0)

你的学习率太高了。它应该在0.01附近,你可以试验它,但0.5太高了。

学习率很高,网络可能会陷入配置状态并输出固定的内容,就像您观察到的那样。

修改

似乎真正的问题是数据集中的不平衡类。你可以尝试:

  • 改变损失,使不那么频繁的例子获得更高的损失
  • 使用平衡批量数据更改采样策略。在批处理中选择64个示例时,在数据集中随机选择,但每个类的概率相同。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我担心这是一个新手的错误。将数据文件夹中的数据转换为单个.pickle文件时,我使用了:

  imageFileNames = os.listdir(folder)

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

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

故事的道德:始终确保您的输入符合您的预期。只需看一眼即可,确保它们看起来正确。

非常感谢所有给出建议的人,我实际上从这里学到了负担: - )