【问题标题】:Configuration of CNN model for recognition of sequential data - Architecture of the top of the CNN - Parallel Layers用于识别顺序数据的 CNN 模型的配置 - CNN 顶部的架构 - 并行层
【发布时间】:2020-10-23 00:34:39
【问题描述】:

我正在尝试配置一个网络以识别车牌等顺序数据的字符。 现在我想在深度自动车牌识别系统中使用表3中提到的架构(链接:http://www.ee.iisc.ac.in/people/faculty/soma.biswas/Papers/jain_icgvip2016_alpr.pdf)。

作者提出的架构是这样的:

第一层很常见,但我遇到的问题是架构的顶部(红框内的部分)。他们提到了 11 个并行层,我真的不确定如何在 Python 中得到它。我编写了这个架构,但它似乎不适合我。

model = Sequential()
model.add(Conv2D(64, kernel_size=(5, 5), input_shape = (32, 96, 3), activation = "relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(128, kernel_size=(3, 3), activation = "relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(256, kernel_size=(3, 3), activation = "relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(1024, activation = "relu"))
model.add(Dense(11*37, activation="Softmax"))
model.add(keras.layers.Reshape((11, 37)))

有人可以帮忙吗?我如何必须对顶部进行编码才能获得与作者相同的架构?

【问题讨论】:

    标签: python architecture conv-neural-network


    【解决方案1】:

    下面的代码可以构建图片中描述的架构。

    import tensorflow as tf
    from tensorflow.keras.models import Sequential, Model
    from tensorflow.keras.layers import Conv2D, Flatten, MaxPooling2D, Dense, Input, Reshape, Concatenate, Dropout
    
    def create_model(input_shape = (32, 96, 1)):
        input_img = Input(shape=input_shape)
        '''
        Add the ST Layer here.
        '''
        model = Conv2D(64, kernel_size=(5, 5), input_shape = input_shape, activation = "relu")(input_img)
        model = MaxPooling2D(pool_size=(2, 2))(model)
        model = Dropout(0.25)(model)
    
        model = Conv2D(128, kernel_size=(3, 3), input_shape = input_shape, activation = "relu")(model)
        model = MaxPooling2D(pool_size=(2, 2))(model)
        model = Dropout(0.25)(model)
    
        model = Conv2D(256, kernel_size=(3, 3), input_shape = input_shape, activation = "relu")(model)
        model = MaxPooling2D(pool_size=(2, 2))(model)
        model = Dropout(0.25)(model)
    
        model = Flatten()(model)
        backbone = Dense(1024, activation="relu")(model)
    
        branches = []
        for i in range(11):
            branches.append(backbone)
            branches[i] = Dense(37, activation = "softmax", name="branch_"+str(i))(branches[i])
        
        output = Concatenate(axis=1)(branches)
        output = Reshape((11, 37))(output)
        model = Model(input_img, output)
    
        return model
    

    【讨论】:

    • 这个模型似乎比另一个模型更容易训练。我想知道这一点,因为他们都在类似的任务上取得了相似的准确性..
    • 输入图像大小将主要负责。由于这里的输入图像更小,模型可以更浅更简单,并且仍然提供相同的精度。
    • 如何将这样的模型应用于我的数据?我可以使用model.fit_generator吗?
    • 是的,您可以使用model.fit_generator 或只使用model.fit,因为该功能已更新为相同的行为方式,而model.fit_generator 已弃用。
    • lutzroeder.github.io/netron 将模型架构另存为.json 文件并加载到 Netron。
    【解决方案2】:

    据我了解,您的实现几乎是正确的。作者训练了 11 个单独的分类器,将全连接层的输出作为输入。在这里,您可以将“并行”视为“独立”。

    但是,您不能在全连接层之后立即应用 Softmax 激活。由于所有分类器都是独立的,我们希望它们中的每一个都为每个可能的字符输出一个概率。换句话说,我们希望每个分类器的输出总和为 1。因此,正确的实现是:

    ...
    model.add(Dense(1024, activation = "relu"))
    # Feeding every neuron with the previous layer's output
    model.add(Dense(11*37))
    model.add(keras.layers.Reshape((11, 37)))
    model.add(keras.activations.softmax(x, axis=1))
    

    【讨论】:

    • 好的,谢谢!你介意看看这个非常相似的问题吗?它也是赏金的,我认为我在这个问题中寻找的架构非常相似,也许可以在这里确认你的答案。那就太好了!我也愿意给你两个赏金,但如果你能通过看看这个问题来重新检查你的答案,我会非常高兴:stackoverflow.com/questions/61521042/…
    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2016-11-18
    相关资源
    最近更新 更多