比如说,我已经在一个预先训练过的网络上完成了转移学习,以识别10个物体。我如何添加一个11^{th}项目,网络可以分类,而不丢失所有的10个类别,我已经培训和信息,从原来的预培训模型?一位朋友告诉我,这一领域正在进行积极的研究,但我找不到任何相关的论文或名字可供搜索。
发布于 2016-12-10 16:44:52
如果这只是一次的情况,你可以简单地重新训练神经网络。如果您经常需要添加新的类,那么这是个坏主意。在这种情况下,您想要做的是所谓的基于内容的图像检索(CBIR),或简单的图像检索或视觉搜索。我将在下面的答复中解释这两种情况。
如果这种情况只发生过一次--您忘记了11级,或者您的客户改变了主意--但是不会再次发生这种情况,那么您可以简单地将第11个输出节点放到最后一个层。将权重随机初始化到此节点,但使用其他输出的权重。然后,就像往常一样训练它。这可能是有帮助的,一些重量,即不训练这些。
一个极端的情况是,只训练新的重量,让所有其他的固定。但我不确定这是否会有那么好的效果--也许值得一试。
基于
请考虑以下示例:您正在为CD店工作,该商店希望他们的客户能够为相册封面拍照,应用程序将显示他们在网上商店中扫描的CD。在这种情况下,你将不得不重新训练网络的每一个新的CD在商店里。这可能是每天5张新光盘,所以重新培训网络的方式是不合适的。
解决方案是训练一个网络,将图像映射到一个特征空间。每幅图像都将由一个描述符来表示,即256维向量.您可以通过计算此描述符并将其与描述符数据库(即存储中所有CD的描述符)进行比较来对图像进行“分类”。数据库中最接近的描述符获胜。
如何训练神经网络来学习这样的描述向量?这是一个活跃的研究领域。您可以通过搜索诸如“图像检索”或“度量学习”这样的关键字来找到最近的工作。
现在,人们通常采取预先训练的网络,如VGG-16,切断FC层,并使用最终卷积作为你的描述符向量。您可以进一步培训这个网络,例如使用三重态损失的暹罗网络。
发布于 2019-08-08 05:58:25
这是很容易做到的。
首先使用这10个类构建一个模型,并将模型保存为base_model。
加载base_model并将名为new_model的新模型定义为-
new_model = Sequential()
然后将base_model的层添加到new_model -
# getting all the layers except the last two layers
for layer in base_model.layers[:-2]: #just exclude the last two layers from base_model
new_model.add(layer)
现在,使新模型的层不可训练,因为您不希望您的模型再次培训。
# prevent the already trained layers from being trained again
for layer in new_model.layers:
layer.trainable = False
当你转移学习的时候,当你移除最后的层时,模型会忘记10个类,所以我们必须把base_model的权重保留给new_model -
weights_training = base_model.layers[-2].get_weights()
new_model.layers[-2].set_weights(weights_training)
现在,在最后添加一个密集层,我们将只在这个示例中训练这个密集层。
new_model.add(Dense(CLASSES, name = 'new_Dense', activation = 'softmax'))
现在训练这个模型,我希望它能为所有11个类提供正确的输出。
学习愉快。
发布于 2016-12-10 09:19:23
您的网络拓扑可能看起来不同,但在最后,您的预先培训的网络有一个层,它处理10个原始类的识别。最简单的(和工作)技巧介绍11,12..。nth类是在最后一层之前使用所有被授予的层,并添加一个附加层(在一个新模型中,或者作为一个并行的层),该层也将位于所有层的顶部,除了最后一层之外,它看起来类似于10类层(这很可能是密集层的匹配,形状[len(dense layer), 10]
的矩阵具有可选的偏差)。
您的新图层将是具有形状[len(dense layer), len(new classes)]
的matmul层。
如果无法访问原始培训数据,您将有两种选择:
虽然,如果您可以访问原始培训数据,您可以轻松地向原始网络添加新的类,并重新培训它以支持11个班的开箱即用。
https://datascience.stackexchange.com/questions/15656
复制相似问题