首页 > 解决方案 > 使用 MobileNetV1 的多位数分类器

问题描述

我想训练一个模型能够对图像中的 16 个数字进行分类,数字的数量是常数。所以我像这些图像一样创建我的数据集(在 SUN 数据集背景上打印具有不同字体和大小的随机 16 个数字):

在此处输入图像描述

我的训练数据集大约有 3000 张图像和 600 张用于验证的图像。

所以我想使用 MobileNetV1 作为特征提取器,并为每个数字连接到 16 个 softmax 输出层。

这是我创建模型的代码片段

base_model = MobileNet(input_shape=None,
                           alpha=0.25,
                           depth_multiplier=1,
                           include_top=False,
                           weights='imagenet,
                           input_tensor=None,
                           pooling=None)

    x = base_model.output
    x = layers.AvgPool2D()(x)
    digits = []
    for i in range(16):
        temp = layers.Conv2D(10, 1, 1, padding='same', name=str(i) + '_digits')(x)

        temp = layers.Dense(10, activation='softmax')(temp)
        digits.append(temp)

    model = Model(inputs=base_model.inputs, outputs=digits)
    model.compile(optimizer=optimizers.RMSprop(), loss='categorical_crossentropy',
                  metrics=['accuracy'])

所以我的数据集图片大小是(650,65),训练张量形状是(3000,650,65,3),归一化值在-1和1之间

我的火车标签是一个热张量的 16 个数组,形状为 (16,3000,10)

我的模型编译成功并开始训练,但我的损失和 val_loss 在时期没有得到改善。

基本上我想创建像这张图片这样的模型,因为这个模型在这个数字分类问题上效果很好。 在此处输入图像描述

该模型架构的顶部类似于 MobileNetV1,输入是调整大小和归一化块。

标签: tensorflowneural-networkconv-neural-networktext-classificationmobilenet

解决方案


推荐阅读