CNN Keras对象定位-错误的预测

时间:2019-01-06 17:50:57

标签: tensorflow machine-learning keras conv-neural-network object-detection

我是机器学习的初学者,目前正在尝试预测对象在图像中的位置,该图像是我创建的数据集的一部分。

此数据集总共包含约300张图像,并包含2类(Ace和2类)。

我创建了一个CNN,可以预测它是A还是Ace,准确度约为88%。

由于这个数据集做得很好,所以我决定尝试预测卡的位置(而不是类)。我阅读了一些文章,据我了解,我所要做的就是采用与我用来预测类的CNN相同的方法,并将最后一层更改为4个节点的Dense层。 那就是我所做的,但是显然这是行不通的。

这是我的模特:

model = Sequential()

model.add(Conv2D(64,(3,3),input_shape = (150,150,1)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=2))

model.add(Conv2D(32,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=2))

model.add(Dense(64))
model.add(Activation("relu"))

model.add(Flatten())
model.add(Dense(4))

model.compile(loss="mean_squared_error",optimizer='adam',metrics=[])

model.fit(X,y,batch_size=1,validation_split=0,
epochs=30,verbose=1,callbacks=[TENSOR_BOARD])   

我提供给模型的东西

X :150x150像素的灰度图像。每个像素在[0-1]

之间重新缩放

y :对象的最小X坐标,最大Y坐标,宽度和高度(这些值均在[0-1]之间。

这是它给我的预测示例:

[array([ 28.66145 ,  41.278576,  -9.568813, -13.520659], dtype=float32)]

但是我真正想要的是:

[0.32, 0.38666666666666666, 0.4, 0.43333333333333335]

我知道这里有问题,所以我决定在单个图像上训练和测试我的CNN(因此,如果可行,它应该过拟合并预测该单个图像的正确边界框)。即使对这幅图像进行过拟合,预测值仍然很高。

所以我的问题是:  我在做什么错了?

编辑1

尝试@Matias的解决方案后,是在最后一层添加S型激活函数,现在所有输出值都在[0,1]之间。

但是,即使这样,该模型仍然会产生不良输出。 例如,在同一图像上训练10个历元后,它可以预测:

[array([0.0000000e+00, 0.0000000e+00, 8.4378130e-18, 4.2288357e-07],dtype=float32)]

但是我期望的是:

[0.2866666666666667, 0.31333333333333335, 0.44666666666666666, 0.5]

编辑2

好吧,因此,经过一段时间的试验,我得出的结论是问题要么出在我的模型上,要么出在它的构建方式上 或缺少培训数据。

但是,即使是由于缺乏训练数据引起的,我也应该能够在一张图像上进行过拟合,以便对此图像做出正确的预测,对吧?

我创建了另一条帖子,询问了自上一个问题以来的最后一个问题,我不想完全重新编辑该帖子,因为它会使第一个答案变得毫无意义。

1 个答案:

答案 0 :(得分:1)

由于目标(Y值)已归一化为[0,1]范围,因此模型的输出应与此范围匹配。为此,您应该在输出层使用S形激活,以便将输出限制在[0,1]范围内:

model.add(Dense(4, activation='sigmoid'))