重新塑造Keras层

12

我有一个输入图像为416x416。如何创建一个4 x 10的输出,其中4是列数,10是行数?

我的标签数据是一个4列10行的二维数组。

我知道有reshape()方法,但它要求结果形状与输入具有相同数量的元素。

通过416 x 416的输入大小和最大池化层,我可以得到最大的13 x 13输出。

有没有办法实现4x10的输出而不会丢失数据?

我的输入标签数据看起来就像这样

[[  0   0   0   0]
 [  0   0   0   0]
 [  0   0   0   0]
 [  0   0   0   0]
 [  0   0   0   0]
 [  0   0   0   0]
 [  0   0   0   0]
 [116  16 128  51]
 [132  16 149  52]
 [ 68  31  77  88]
 [ 79  34  96  92]
 [126  37 147 112]
 [100  41 126 116]]

这表示我的图像中有6个对象需要检测,第一个值是xmin,第二个值是ymin,第三个值是xmax,第四个值是ymax。

我的网络的最后一层看起来像:

(None, 13, 13, 1024)

哦,抱歉,输出是13 x 13 x 1024。标签的形状为4x10,每列代表一个边界框。因此我最多可以检测到10个框。我的训练批次大小为5。 - Darlyn
我会更新我的问题,例如我的标签数据示例。 - Darlyn
那么你想回归值(xmin、ymin、xmax、ymax)吗?在重塑后,你考虑尝试什么呢? - ldavid
不,输入应该保持原样。但是我的卷积神经网络的输出形状应该与输入匹配。 - Darlyn
让我们在聊天中继续这个讨论 - ldavid
显示剩余2条评论
2个回答

10

首先将 (None, 13, 13, 1024) 层展平

model.add(Flatten())

它将给出 13*13*1024=173056

1维张量

然后添加一个密集层

model.add(Dense(4*10)) 它将输出40

这将把您的3D形状转换为1D

然后只需调整大小以满足您的需求

model.add(Reshape(4,10))

这将工作,但会彻底破坏您的数据的空间性质


4

我相信符合您所需输出的预测形状的最简单方法是@Darlyn提出的解决方案。假设您目前拥有的网络已经声明(输出形状为(13, 13, 1024)的张量),如下所示:

x = Input(shape=(416, 416, 3))
y = Conv2D(32, activation='relu')(x)
...
y = Conv2D(1024, activation='relu')(y)

您只需要添加一个回归层,该层将尝试预测框,并将其重新形状为(10, 4)

from keras.layers import Flatten, Dense, Reshape

samples = 1
boxes = 10

y = Flatten(name='flatten')(model.outputs)
y = Dense(boxes * 4, activation='relu')(y)
y = Reshape((boxes, 4), name='predictions')(y)
model = Model(inputs=model.inputs, outputs=y)

x_train = np.random.randn(samples, 416, 416, 3)

p = model.predict(x_train)
print(p.shape)

(1, 10, 4)

这个可以工作,但是我不确定直接回归这些值是否会产生好的结果。通常情况下,目标检测模型使用注意力、区域或显著性来确定物体的位置。有一些基于Keras的目标检测实现可以尝试:

keras-rcnn

classes = ["dog", "cat", "hooman"]

backbone = keras_rcnn.models.backbone.VGG16
model = keras_rcnn.models.RCNN((416, 416, 3), classes, backbone)
boxes, predictions = model.predict(x)

keras-retinanet

from keras_retinanet.models.resnet import resnet_retinanet

x = Input(shape=(416, 416, 3))
model = resnet_retinanet(len(classes), inputs=x)
_, _, boxes, _ = model.predict_on_batch(inputs)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接