【问题标题】:Reshaping Keras layers重塑 Keras 层
【发布时间】:2018-09-12 16:49:37
【问题描述】:

我有一个 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)

【问题讨论】:

  • 卷积的输出通常是(batch_size, height, width, kernels)格式的4-rank张量。我可以看到高度和宽度是 13,但是你有多少内核? 4 是您的batch_size,还是要将单个样本转换为 4 个不同的样本?
  • 抱歉,输出是 13 x 13 x 1024。标签的形状是 4x 10 ,每个列代表一个边界框。所以我最多检测到 10 个盒子。我的训练批次大小是 5。
  • 你有13 * 13 * 1024 = 173056 号码可以重塑为4 * 10 = 40。我想说在不丢失数据的情况下重塑这是不可能的。你想做什么?您能否举例说明您的标签数据是什么样的?
  • 我将更新 m queston 例如我的标签数据
  • 所以你想回归值(xmin, ymin, xmax, ymax)?重塑后你在想什么?

标签: python neural-network keras artificial-intelligence conv-neural-network


【解决方案1】:

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

model.add(Flatten())

它会给13*13*1024=173056

一维张量

然后添加一个密集层

model.add(Dense(4*10)) 会输出到 40

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

然后根据您的需要调整大小

model.add(Reshape(4,10))

这会起作用,但绝对会破坏数据的空间特性

【讨论】:

    【解决方案2】:

    我相信使您的预测形状符合所需输出的最简单方法是@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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      相关资源
      最近更新 更多