【问题标题】:Keras Transfer Learning on More Than 1000 classes超过 1000 个课程的 Keras 迁移学习
【发布时间】:2019-06-06 22:37:41
【问题描述】:

您如何将 InceptionV3、ResNet50 等在 ImageNet(约 1000 个类)上训练的模型的迁移学习应用于超过 1000 个类的问题?

我正在使用 Keras,但对其他解决方案持开放态度。我熟悉加载训练网络的所有权重(如 ImageNet 上的 ResNet50)的想法,除了顶部(具有 1000 个单位的最终分类层),然后将网络的末端连接到我可以指定的其他层(全连接层、池化等)。然而,在许多这些网络中,最后一层之前的层少于 3000 个单元,因此添加一个超过 3000 个单元的层将是一个扩展层,有点像自动编码器中的解码器。通常,我已经看到最后一层的尺寸减小了。解决这个问题的最佳方法是什么?

Keras 应用中的例子是:

from keras.applications.inception_v3 import InceptionV3
from keras.preprocessing import image
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
from keras import backend as K

# create the base pre-trained model
base_model = InceptionV3(weights='imagenet', include_top=False)

# add a global spatial average pooling layer
x = base_model.output
x = GlobalAveragePooling2D()(x)
# let's add a fully-connected layer
x = Dense(1024, activation='relu')(x)
# and a logistic layer -- let's say we have 200 classes
predictions = Dense(200, activation='softmax')(x)

【问题讨论】:

  • 这里的实际编程问题是什么?
  • 我正在尝试解决一个图像分类问题,我有超过 3000 个不同的对象要分类。
  • 是的,这很清楚,但问题是什么?我认为这样数量的课程没有任何问题。

标签: machine-learning keras conv-neural-network


【解决方案1】:

简单: 在您的代码示例中,只需更改此行:

predictions = Dense(200, activation='softmax')(x)

您在哪里输入您想要训练的任意数量的课程,而不是 200 个,例如假设您有 3000 个课程。那么这将是:

predictions = Dense(3000, activation='softmax')(x)

【讨论】:

    【解决方案2】:

    这称为微调 keras 模型。您应该删除训练模型的最后一层,然后对于每一层,您必须使用以下方法使权重更新为 false:

    layer.trainable=False 
    

    之后你可以添加你的自定义层

    例如:如果您愿意,可以添加一个包含 1000 多个类的密集层并对其进行训练。然后,您可以在训练过程中更新最后一层的权重

    如需更多帮助,请参阅此视频video 干杯:-)

    【讨论】:

    • 有道理,谢谢。我仍然想知道是否可以在上一层中拥有比单元更多的类。
    • 是的,可能有缺点,但影响不大。这是唯一的方法。如果您还要更改以前的图层,模型的质量将会下降
    • @Dulmina 如果您可以提供代码示例,那将非常有帮助。
    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 2020-10-04
    • 2020-02-11
    • 2020-11-08
    • 2021-02-01
    • 1970-01-01
    • 2021-06-03
    • 2023-03-19
    相关资源
    最近更新 更多