如何重置特定层的权重以进行迁移学习?

我正在寻找一种方法来重新初始化现有Keras预训练模型中某一层的权重。

我使用Python和Keras进行迁移学习,加载预训练的Keras模型时使用以下代码:

from keras.applications import vgg16, inception_v3, resnet50, mobilenetvgg_model = vgg16.VGG16(weights='imagenet')

我了解到,当使用的数据集与原始数据集非常不同时,可能有益于在已训练网络的低级特征上创建新层。

我找到了如何进行微调参数的方法,现在我正在寻找一种方法来重置选定的层,以便重新训练。我知道我可以创建一个新模型,并使用第n-1层作为输入,然后添加第n层,但我正在寻找一种方法来重置现有模型中现有层的参数。


回答:

无论出于何种原因,您可能希望重新初始化单个层k的权重,以下是实现这一目标的一般方法:

from keras.applications import vgg16from keras import backend as Kvgg_model = vgg16.VGG16(weights='imagenet')sess = K.get_session()initial_weights = vgg_model.get_weights()from keras.initializers import glorot_uniform  # 或者您选择的初始化器k = 30 # 假设是第30层new_weights = [glorot_uniform()(initial_weights[i].shape).eval(session=sess) if i==k else initial_weights[i] for i in range(len(initial_weights))]vgg_model.set_weights(new_weights)

您可以轻松验证initial_weights[k]==new_weights[k]返回一个False数组,而对于任何其他iinitial_weights[i]==new_weights[i]返回一个True数组。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注