【发布时间】:2019-10-21 01:33:58
【问题描述】:
我正在尝试构建一个可以估计图像(或二维对象)旋转的 CNN(在 Keras 中)。所以基本上,输入是图像,输出应该是它的旋转。
我的第一个实验是估计 MŃIST 数字的旋转(仅从一个数字“class”开始,比如说“3”)。所以我所做的是从 MNIST 集合中提取所有 3,然后构建一个“旋转 3”数据集,通过多次随机旋转这些图像,并将旋转后的图像连同它们的旋转角度一起存储为地面实况标签。
所以我的第一个问题是 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 作为损失函数
提前感谢您提供任何建议、提示或指出我可能犯的错误!
【问题讨论】:
标签: keras regression conv-neural-network image-rotation