关于使用Keras进行迁移学习的讨论

时间:2020-06-15 09:26:07

标签: keras deep-learning cnn transfer-learning activity-recognition

我目前正在基于传感器的活动数据集上进行迁移学习,我尝试了两种方法来迁移先前在另一个数据集上训练过的模型。

第一种传输方式是加载训练后的模型,切断最后的密集层和softmax分类层,添加新的密集层和softmax层(对应于新类的数量),冻结除新层之外的每一层在新数据集中添加了模型并将其拟合。这导致F1分数达到30%。

传输模型的第二种方法是基于新数据集初始化新模型,冻结除最后一层以外的每一层,仅将权重从加载的模型传输到新初始化的模型,然后训练模型。这导致F1-Score达到大约90%。

所以现在,我正在尝试找出这两种转移模型的方法之间到底有什么区别。最后的第二种方法只是一个新模型,其中权重已使用已受过训练的权重进行了初始化,而不是使用来自初始化函数(glorot_uniform,lecun_uniform等)的权重进行了初始化,对吗?就我对转学的理解而言,这也是正确的方法。 就我理解的概念而言,在转移学习中,您仅重用权重,而不是整个模型。

我仍然想知道还有什么因素严重影响了第一种方法的训练,以至于F1仅占30%?

感谢和问候。

1 个答案:

答案 0 :(得分:0)

我刚刚意识到一些错误,我将在这里发布我的代码,以帮助其他人不要犯同样的错误。

转移模型后,F1-分数30%实际上是正确的值。之所以获得F1-Score大约90%的原因是,因为我从头开始再次训练我的网络。我在传输过程中做错了以下事情:

  1. 我没有冻结图层,而是将整个图层设置为False(令人惊讶的是没有抛出异常)(第5行)
  2. loaded_net保持未定义状态,直到执行第2行中的网络初始化为止。这意味着,我之前训练有素的权重将被直接覆盖。
1            loaded_net = tensorflow.keras.models.clone_model(self.neural_network)
2            self.init_network()
3            for i in range(1, len(loaded_net.layers[:-1])):
4                self.neural_network.layers[i].set_weights(loaded_net.layers[i].get_weights())
5                self.neural_network.layers[i] = False
6            self.neural_network.compile(loss='mse', optimizer=self.optimizer,
7                                        metrics=(['accuracy', f1, precision, recall]))

感谢和问候,