【问题标题】:Multi Output Convolutional Neural Network多输出卷积神经网络
【发布时间】:2020-08-16 19:50:44
【问题描述】:

我正在开发用于图像分类的卷积神经网络,或者更好地用于车牌分类。这些车牌最多包含 8 个字符,每个字符可以包含 37 个字符(A-Z、0-9 和一个空格)。我现在想知道如何设计网络中的最后两层。我认为,最后一个必须是具有 37 个概率的 softmax 层。这应该完全连接到之前层中的一个(?)神经元?我认为,在之前的层中我们需要 8 个神经元,因为之前的车牌中有 8 个字符,但我在这里不确定。 在这些层之前,我添加了一些卷积层和 maxPooling 层。这是一种有效的方法还是您有其他建议?

我写了这段代码:

from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), input_shape = (600, 1200, 1), activation = "relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(64, activation = "relu"))
model.add(Dense(8, activation = "relu"))
model.add(Dense(37, activation = "softmax"))

model.compile(optimizer="rmsprop", loss="categorical_crossentropy", metrics=["accuracy"])

特别是关于我的 Flatten Layer 之后的层,我真的不确定......有没有人可以提供帮助?我希望我正确地描述了我的问题...

【问题讨论】:

    标签: python architecture conv-neural-network


    【解决方案1】:

    在您之前的层中,有许多常用的架构,您可以尝试在数据集上获得更高的准确性。

    在密集层上,有多种方法可以解决它。 因为,最多有 8 个字符,每个字符有 37 个可能的字符。您可以将最后一层设置为model.add(Dense(37*8, activation = "sigmoid")),阈值为 0.5 以表示所有 37*8 的可能性。

     model = Sequential()
     model.add(Conv2D(32, kernel_size=(3, 3), input_shape = (600, 1200, 1), activation = "relu"))
     model.add(MaxPooling2D(pool_size=(2, 2)))
     model.add(Dropout(0.25))
     model.add(Flatten())
     model.add(Dense(64, activation = "relu"))
     model.add(Dense(37*8, activation = "relu"))
    

    更合适的方法是有 9 个输出层:一个有 8 个神经元来表示字符的存在,另外 8 个层有 37 个神经元,每个都有 softmax 来表示它是什么字符。请注意,要执行此操作,您必须使用功能 API 而不是顺序 API。

    一个例子:

     inp = Input(shape=(600,1200,1))
     X = Conv2D(32, kernel_size=(3, 3), activation = "relu")(inp)
     X = MaxPooling2D(pool_size=(2, 2))(X)
     X = Dropout(0.25)(X)
     X = Flatten()(X)
     X = Dense(64, activation = "relu")(X)
     P = Dense(8, activation = "relu")(X)
     C1 = Dense(37, activation = "softmax")(X)
     ...
     C8 = Dense(37, activation = "softmax")(X)
     model = Model(inp, [P,C1,C2,...C8])
    

    【讨论】:

    • 您好,非常感谢!这对我来说听起来很有趣!尽管如此,我仍然对代码有些挣扎,尤其是下面的代码。我尝试将其应用于我的数据并得到以下错误代码:ValueError: Error when checking model target: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 9 array(s), but instead got the following list of 1 arrays: [array([[[0, 1, 0, ..., 0, 0, 0],。我特别想知道,因为它说它想查看 9 个输入数组。我有 8 个 37 个字符的数组,想要第 9 个数组是什么?
    • 一个附加问题:当我将第一个代码用于顺序 API 时。我需要一个形状为 (1, 296) 而不是 (8, 37) 的目标。这有意义吗?
    猜你喜欢
    • 2018-01-24
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多