CNN Keras对象定位-错误预测

68bkxrlz  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(84)

我是机器学习的初学者,目前正在尝试预测对象在图像中的位置,该图像是我创建的数据集的一部分。
该数据集总共包含约300张图像,并包含2个类(Ace和Two)。
我创建了一个CNN,它可以预测它是一张A还是两张,准确率约为88%。
由于这个数据集做得很好,我决定尝试预测卡片的位置(而不是类)。我读了一些文章,从我所理解的,我所要做的就是采取相同的CNN,我用来预测类,并改变最后一层的4个节点的密集层。这就是我所做的,但显然这是行不通的。
下面是我的模型:

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:150 x150像素的灰度图像。每个像素在[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个图像,以获得正确的预测,这一个,对不对?

我创建了另一个帖子,问我的最后一个问题,因为原来的一个已经回答,我不想完全重新编辑后,因为它会使第一次的答案有点毫无意义。

i1icjdpr

i1icjdpr1#

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

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

相关问题