我正在尝试构建一个CNN(在Keras中),可以估计图像(或2d对象)的旋转。因此,基本上,输入是图像,输出应该是图像的旋转。
我的第一个实验是估计MŃIST数字的轮换(仅从一个数字“ class”开始,比如说“ 3”)。因此,我要做的是从MNIST集合中提取所有3s,然后通过多次随机旋转这些图像并将其与旋转角度以及旋转角度一起存储为地面真实标签,来构建“旋转3s”数据集。
所以我的第一个问题是2D旋转是周期性的,我不知道如何为这种行为建模。因此,我将角度编码为y = sin(ang),x = cos(ang)。这给了我数据集(旋转的3s图像)和相应的标签(x和y值)。
首先,对于CNN,我仅以keras MNIST CNN示例(https://keras.io/examples/mnist_cnn/)替换为最后一个密集层(具有10个输出和softmax激活),该密集层具有2个输出(x和y)和tanh激活(因为y = sin(ang),x = cos(ang)在[-1,1]之内)。
我最后要决定的就是损失函数,我基本上想对角度进行距离测量。因此,我认为“ cosine_proximity”是必经之路。
在训练网络时,我可以看到损耗正在减小并收敛到某个点。但是,当我随后检查预测与事实真相时,发现(对我而言)相当令人惊讶的行为。几乎所有x和y预测都趋向于0或+/- 1。而且由于旋转的“解码”为ang = atan2(y,x),因此预测通常为+/- 0°,45°,90、135°或180°。 但是,我的训练和测试数据只有0°,20°,40°... 360°的角度。 如果我改变网络的复杂性,这并没有真正改变。我还尝试了优化器参数,但没有成功。
这些假设是否有误: -角度的x,y编码 -tanh激活值为[-1,1] -cosine_proximity作为损失函数
在此先感谢您提供任何建议,技巧或指出我可能犯的错误!
答案 0 :(得分:0)
很难给您确切的答案,所以让我们尝试一些想法: