比方说冻住最后三层的参数,不让它们被训练更新:
for layer in model.layers[:-3]:
layer.trainable = False
或者在model建立的时候就设定好参数,比如:
frozen_layer = Dense(32, trainable=False) #在compile之后才会生效
model.add(Dense(512, trainable=False))
x=Convolution2D(64,[3,3],strides=1,
name='layer1')(inputs)
x.trainable=False
整体权重的导入与保存采用下面的code:
model.save_weights('./weights.h5')
model.load_weights('./weights.h5')
有的时候,如果网络结构相同,当你只想载入部分权重的时候,这时可以利用名称name相同来做文章,比如
model.layers[5].name = 'null'
model.load_weights('./weights.h5', by_name=True)
后面的by_name一定要设置为true,这样第5层的网络的参数就不会被加载了。
一层一层的加也可以,比方说这样:
weights_list = model_old.get_weights()
对新的model设定参数:
for i, weights in enumerate(weights_list[0:3]):
model.layers[i].set_weights(weights)
或者这样,每层单独的更新:
for j in range(len(model.layers)):
model.layers[j].kernel = 1
model.layers[j].bias = 0