我是机器学习和stackoverflow的新手。
最近,我一直在尝试创建一个机器学习算法,通过对象的反射来估计光源的方向。我知道这可能是一个复杂的主题,这就是为什么作为第一步,我尽可能地简化了这个问题。
我首先将问题从回归问题转变为分类问题,只考虑输出:光源在对象的左侧或光源在对象的右侧。我的数据集中也只让一个角度发生变化。
我的问题的简短版本:
- 你认为用机器学习可以做到这样的事情吗?(我的经验太有限了,无法确定)
- 如果可以,你认为最适合的神经网络是什么?CNN?R-CNN?LSTM?SVM?
- 完成这项任务的流程是什么?
我目前使用Unity引擎和方向光,方向光在[10,60] / [120,170]之间随机选择X角度,并使用具有金属反射的球体来创建和标记数据集。这里是一个例子:
https://i.sstatic.net/eqe1v.jpg 标签:0(左侧)
https://i.sstatic.net/5OUAX.jpg 标签:1(右侧)
对于预处理:
- 图片调整为64×64尺寸
- 从RGB转换为灰度格式。
对于机器学习,我目前使用tensorflow和卷积神经网络,配置如下:
-
10000个平衡的、标记好的64×64灰度图片作为输入,0/1作为标签
-
3个卷积层,滤波器数量为[16,32,64],大小为[5,5],使用RELU激活函数
-
3个池化层,大小为[2,2],步长为[2,2]
-
1个全连接层,1024个隐藏神经元,使用dropout(丢弃率=0.4),使用RELU激活函数
-
1个全连接层,2个输出神经元(每个类别一个),使用Softmax激活函数
关于问题:我的网络根本没有学习,损失几乎没有下降,准确率显示好的结果是随机的,无论数据、层数、优化器、学习率等如何,我的输出只是在两个类别之间平均:[0.5 , 0.5]。
我的猜测是这个问题比我最初想象的要复杂,我的数据没有提供一个好的提示来预测结果,我应该训练一个能够检测对象上反射点的网络,然后使用对象中心和反射点之间的方向。我对吗?
另一个猜测是卷积层没有考虑位置,因此对于卷积部分,所有图片都是相同的,因为球体始终是相同的,光照模式也是如此。它总是会检测到相同的东西,不会考虑光区域已经移动。你对我可以使用哪种网络来解决这个问题有什么建议吗?
我真的在寻找一些建议和警告,关于如何处理这种任务。请记住,我对机器学习还是相当新手,我还在学习比我的机器更多的知识,呵呵…
谢谢你。
回答:
你认为用机器学习可以做到这样的事情吗?
绝对可以。你正确地选择了CNN模型——这是最适合这项任务的模型。
我的猜测是这个问题比我最初想象的要复杂,我的数据没有提供一个好的提示来预测结果,我应该训练一个能够检测对象上反射点的网络,然后使用对象中心和反射点之间的方向。我对吗?
不,CNN已经证明可以很好地从原始像素进行分类。它应该自己找出需要关注什么。
你对我可以使用哪种网络来解决这个问题有什么建议吗?
如果你能提供你的完整代码会很好。有很多原因可能导致无法学习:图像预处理错误、数据标记错误、超参数选择不当(学习率、初始化等)、错误的损失函数等,可能只是有简单的错误。
根据你描述的CNN架构,我建议立即采取以下措施:
5x5
的滤波器大小可能太大,因为你没有那么多滤波器。尝试使用3x3
并稍微增加滤波器数量,例如32 - 64 - 64
。- 我假设你使用的是
CONV - POLL - CONV - POLL - CONV - POOL
,而不是CONV - CONV - CONV - POOL - POOL - POLL
。只是为了确认一下。 - 你可能不需要在全连接层中使用那么多神经元。你只有两个类别,而且图片非常相似!将
1024
减少到256
左右。 - 你目前没有遇到过拟合问题,所以暂时禁用dropout:
keep_probability=1.0
。 - 注意初始化和学习率。尝试在对数尺度上使用不同的值,例如
learning_rate = 0.1, 0.01, 0.001
,并检查学习模式是否有变化。