您如何将通过ImageNet(约1000类)训练的InceptionV3,ResNet50等模型的迁移学习应用于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)
答案 0 :(得分:1)
这称为微调keras模型。您应该删除训练模型的最后一层,然后对于每一层,必须使用以下方法使权重更新为False:
layer.trainable=False
之后,您可以添加自定义图层
例如:如果需要,可以添加一个密集的层,包含1000多个类,并对其进行训练。然后,您可以在训练过程中更新最后一层的权重
有关更多帮助,请参阅此视频video 欢呼:-)
答案 1 :(得分:0)
简单: 在您的代码示例中,只需更改以下行:
predictions = Dense(200, activation='softmax')(x)
您要输入而不是200的任何数量的您想训练的课程,例如说你有3000节课。那应该是:
predictions = Dense(3000, activation='softmax')(x)