机器学习和堆栈溢出的新手。
最近,我一直在尝试创建一种机器学习算法,该算法基于对象的反射来估计光源的方向。 我知道这可能是一个复杂的主题,这就是为什么,作为第一步,我尽可能地简化它。
我首先将问题从回归问题转换为分类问题,仅将其作为输出:光源位于对象的左侧,或者光源位于对象的右侧。 我也只是为我的数据集制作了一个角度。
我的问题的简短版本:
我目前正在使用带有定向光的Unity Engine,它采用[10,60] / [120,170]之间的随机X角和带有金属反射的球体来创建和标记数据集。这是一个例子:
https://imgur.com/a/FxNew标签:0(左侧)
https://imgur.com/a/9KFhi标签:1(右侧)
对于预处理:
对于机器学习,我目前正在使用张量流和卷积神经网络:
10000平衡标记数据,64x64灰度图片作为输入,0/1作为标签
3个带过滤器的卷积层[16,32,64],大小为[5,5] RELU
至于问题:我的网络根本就没有学到损失几乎没有下降,准确性表明好的结果是随机的,无论数据,层数,优化器,学习率,......我的输出只是平均值之间两个类:[0.5,0.5]。
我的猜测是问题比我最初想的要复杂得多,我的数据并没有很好地暗示我的预测应该是什么,我宁愿训练一个检测物体反射点的网络。然后使用对象中心和点之间的方向。我是对的吗?
另一个猜测是卷积层不考虑位置,因此对于卷积部分,所有图像都是相同的,因为球体总是相同的,以及照明模式。它将始终检测到相同的事物,并且不会考虑光区域已移动。您对我可以使用哪个网络来解决此问题有任何建议吗?
我真的在寻找一些建议,警告如何解决这类任务。 请记住,我仍然是机器学习的新手,并且仍然比我的机器学习更多...
谢谢。
答案 0 :(得分:1)
您是否认为通过机器学习可以做这样的事情?
绝对。你正确地选择了CNN模型 - 它最适合这项任务。
我的猜测是问题比我最初想的要复杂得多,我的数据并没有很好地暗示我的预测应该是什么,我宁愿训练一个检测物体反射点的网络。然后使用对象中心和点之间的方向。我是对的吗?
不,CNN已经证明可以从原始像素中进行分类。它应该弄清楚要注意什么。
您对我可以使用哪个网络来解决此问题有任何建议吗?
如果您提供完整的代码,我会很高兴。没有学习的原因有很多:图像预处理错误,数据错误标记,超参数选择不当(学习率,初始化......),错误丢失功能等等。可能只有错误
基于所描述的CNN架构,我立即建议:
5x5
过滤器大小可能太大,因为您没有那么多过滤器。尝试3x3
并稍微增加过滤器数量,例如32 - 64 - 64
。CONV - POLL - CONV - POLL - CONV - POOL
,而不是CONV - CONV - CONV - POOL - POOL - POLL
。只是为了确保。1024
说256
。keep_probability=1.0
。learning_rate = 0.1, 0.01, 0.001
并检查学习模式是否会发生变化。答案 1 :(得分:1)
感谢@Maxim的回答。这非常有帮助,帮助我解决了我的问题以及改进我的网络。
他指出了我的问题:数据错误标记。
我非常确定我的数据标签,但无论如何已经过验证。
问题出在那里......
我在这里写答案,所以它可以帮助其他不知情的tensorflow用户: 当您使用 tf.string_input_producer 而未指定它时,默认值为:“ Shuffle = True ”,它会对您的文件名队列进行随机播放。
由于我使用.csv文件作为图像的标签和.png文件夹,标签的读取顺序为1到10000,而.png文件是随机读取的。
我对此感到非常愚蠢,但这就是你学习嘿嘿的方式。