【问题标题】:How do I format my targets to train a Keras CNN model?如何格式化目标以训练 Keras CNN 模型?
【发布时间】:2018-04-27 03:22:35
【问题描述】:

我的数据集是鲸鱼的图像。我正在尝试训练一个可以在给定图像中定位鲸鱼的 2 个点的 CNN。我的训练特征是 numpy 数组中的图像,目标是图像中 2 个点的 x 和 y 坐标(鲸鱼上的 2 个点)。

使用 Keras 构建可以从我拥有的数据集学习的神经网络,以便能够在新的未标记图像上定位这些点的最佳方法是什么?

我目前的主要问题是弄清楚如何格式化目标(图像中的 2 个点),以便我的 Keras 模型可以理解/读取数据。

我的破代码是:

x_train = np.array([cv2.imread("1small.jpg")])
y_train = np.array([14.1, 13.5, 16.3, 14.1])

x_test = np.array([cv2.imread("0small.jpg")])
y_test = np.array([11.8, 10.8, 17.0, 16.0]) # fake data just to test

model = Sequential()
model.add(Dense(1,32,32,3))
model.add(Activation('tanh'))
model.add(Dense(1))
model.compile(loss='mean_absolute_error', optimizer='rmsprop')

model.fit(x_train, y_train, nb_epoch=1, batch_size=1)

prediction = model.predict(x_test)
print prediction

【问题讨论】:

  • 你能告诉我们更多关于点的信息
  • 它们只是图中鲸鱼的鼻子和气孔的x和y坐标

标签: python tensorflow computer-vision keras


【解决方案1】:

这些网络非常适合学习坐标,因此您可以将数据保留为四个坐标。然后,您可以将损失定义为距离的平方和。这样做的第一个好处是它会更多地惩罚大错误,而更少惩罚小错误,因此它将使网络平稳地走向完美。 :) 第二个好处是,如果您考虑一下,两点的平方距离是坐标差的平方和。所以基本上你可以使用坐标数组上的均方误差作为这个网络的损失。很好很容易。

看看你的网络,你应该在前面添加一些卷积和池化层,密集层不是先看图像的好层。它们应该位于网络的顶部。

另外,tanh 激活是过去十年。 :) 使用relu,除了最后一层,应该没有激活。

还可以考虑转换坐标,使图像的中间为原点,边缘在 -1 和 1 附近。这将使预测空间标准化一点,可能会有所帮助。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多