是否可以保存已训练的层以在Keras上使用层?

9q78igpj  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(143)

我没有用过Keras,我在考虑是否要用它。
我想保存一个已训练的图层以供以后使用。例如:
1.我训练模特。
1.然后,我得到一个训练层t_layer
1.我还有另一个模型要训练,它由layer1layer2layer3组成。
1.我想使用t_layer作为layer2,并且不更新此层(即,t_layer不学习任何更多内容)。
这可能是一个奇怪的尝试,但我想试试这个。这在凯拉斯上可能吗?

ttvkxqim

ttvkxqim1#

是的,是的。
您可能需要保存层的权重和偏移,而不是保存层本身,但这是可能的。
Keras还允许您保存整个模型。
假设在var model中有一个模型:

weightsAndBiases = model.layers[i].get_weights()

这是一个numpy数组的列表,很可能有两个数组:你可以简单地使用numpy.save()来保存这两个数组,然后你可以创建一个类似的层,并给予它权重:

from keras.layers import *
from keras.models import Model

inp = Input(....)    
out1 = SomeKerasLayer(...)(inp)  
out2 = AnotherKerasLayer(....)(out1)
.... 
model = Model(inp,out2)
#above is the usual process of creating a model    

#supposing layer 2 is the layer you want (you can also use names)    

weights = numpy.load(...path to your saved weights)    
biases = numpy.load(... path to your saved biases)
model.layers[2].set_weights([weights,biases])

您可以使层不可训练(必须在模型编译之前完成):

model.layers[2].trainable = False

然后编译模型:

model.compile(.....)

这就是一个模型,它的一层是不可训练的,它的权重和偏差是由你定义的,是从其他地方取来的。

osh3o9ms

osh3o9ms2#

是的,这是迁移学习中的常见做法,请参阅here。下面的piece_to_share可以是一层或多层。

piece_to_share = tf.keras.Model(...)
full_model = tf.keras.Sequential([piece_to_share, ...])
full_model.fit(...)
piece_to_share.save(...)

相关问题