我目前正在基于传感器的活动数据集上进行迁移学习,我尝试了两种方法来迁移先前在另一个数据集上训练过的模型。
第一种传输方式是加载训练后的模型,切断最后的密集层和softmax分类层,添加新的密集层和softmax层(对应于新类的数量),冻结除新层之外的每一层在新数据集中添加了模型并将其拟合。这导致F1分数达到30%。
传输模型的第二种方法是基于新数据集初始化新模型,冻结除最后一层以外的每一层,仅将权重从加载的模型传输到新初始化的模型,然后训练模型。这导致F1-Score达到大约90%。
所以现在,我正在尝试找出这两种转移模型的方法之间到底有什么区别。最后的第二种方法只是一个新模型,其中权重已使用已受过训练的权重进行了初始化,而不是使用来自初始化函数(glorot_uniform,lecun_uniform等)的权重进行了初始化,对吗?就我对转学的理解而言,这也是正确的方法。 就我理解的概念而言,在转移学习中,您仅重用权重,而不是整个模型。
我仍然想知道还有什么因素严重影响了第一种方法的训练,以至于F1仅占30%?
感谢和问候。
答案 0 :(得分:0)
我刚刚意识到一些错误,我将在这里发布我的代码,以帮助其他人不要犯同样的错误。
转移模型后,F1-分数30%实际上是正确的值。之所以获得F1-Score大约90%的原因是,因为我从头开始再次训练我的网络。我在传输过程中做错了以下事情:
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]))
感谢和问候,