作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一种在现有 keras 预训练模型中重新初始化层权重的方法。
我正在将 python 与 keras 一起使用,并且需要使用迁移学习,我使用以下代码加载预训练的 keras 模型
from keras.applications import vgg16, inception_v3, resnet50, mobilenet
vgg_model = vgg16.VGG16(weights='imagenet')
我读到,当使用与原始数据集非常不同的数据集时,在训练网络中的较低级别特征上创建新层可能会有好处。
我找到了如何允许 fine tuning参数,现在我正在寻找一种方法来重置选定的图层以使其重新训练。我知道我可以创建一个新模型并使用第 n-1 层作为输入并向其中添加第 n 层,但我正在寻找一种方法来重置现有模型中现有层中的参数。
最佳答案
无论出于何种原因,您可能想要重新初始化单层k
的权重,以下是执行此操作的通用方法:
from keras.applications import vgg16
from keras import backend as K
vgg_model = vgg16.VGG16(weights='imagenet')
sess = K.get_session()
initial_weights = vgg_model.get_weights()
from keras.initializers import glorot_uniform # Or your initializer of choice
k = 30 # say for layer 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
数组,而 initial_weights[i]==new_weights[ i]
对于任何其他 i
都会返回一个 True
数组。
关于machine-learning - 如何重置迁移学习的特定层权重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52425359/
我是一名优秀的程序员,十分优秀!