代码之家  ›  专栏  ›  技术社区  ›  Ha Bom

OpenCV:无法创建类型为“形状”的层“展平1/形状”

  •  1
  • Ha Bom  · 技术社区  · 7 年前

    我尝试在opencv dnn中实现一个tensorflow模型。这就是我的错误:

    OpenCV:无法创建类型为“形状”的层“展平1/形状”

    我用keras建立了我的模型

    model = Sequential()
    
    model.add(Conv2D(32, (3, 3), input_shape = (32,32,1), activation = 'relu'))
    
    model.add(Conv2D(32, (3, 3), activation = 'relu'))
    model.add(MaxPooling2D(pool_size = (2, 2)))
    model.add(Dropout(0.25))
    
    model.add(Conv2D(64, (3, 3), activation = 'relu'))
    model.add(Conv2D(64, (3, 3), activation = 'relu'))
    model.add(MaxPooling2D(pool_size = (2, 2)))
    model.add(Dropout(0.25))
    
    model.add(Flatten())#<== this is the layer that opencv doesnt support
    
    model.add(Dense(units = 128, activation = 'relu'))
    model.add(Dropout(0.5))
    model.add(Dense(units = num_classes, activation = 'softmax'))
    

    我已经试过了 this

    from tensorflow.python.keras.layers.core import Reshape
    
    model.add(Reshape((-1,)))
    

    TypeError:添加的层必须是类层的实例。在0x000001D21EF1A630处找到:tensorflow.python.keras.layers.core.reforme对象>

    从那里我还没有找到任何解决办法。我的问题是,有没有替代品 Flatten()

    0 回复  |  直到 7 年前
        1
  •  3
  •   Nick Kao    7 年前

    尝试将“展平”更改为以下内容:

    #model.add(Flatten())
    a, b, c, d = model.output_shape
    a = b * c * d
    model.add(Permute([1, 2, 3]))  # Indicate NHWC data layout
    model.add(Reshape((a,)))
    

    https://github.com/opencv/opencv/issues/10135

        2
  •  0
  •   Rodrigo Pereira    6 年前

    我发现OpenCV-dnn只允许推理,所以需要对模型进行推理优化。我使用tensorflow的图形转换工具来实现这一点。

    from tensorflow.tools.graph_transforms import TransformGraph
    
    graph = TransformGraph(graph,
                ["input_1"], # inputs nodes
                ["dense_2/Softmax"], # outputs nodes
                ['fold_constants()',
                'strip_unused_nodes(type=float, shape="None,32,32,1")',
                'remove_nodes(op=Identity, op=CheckNumerics)',
                'fold_batch_norms',
                'fold_old_batch_norms'
                ])