问题描述
你好,我有下面的代码,将预先保存的自定义权重从.cpkt文件加载到resnet模型中。
'''
def resnet_model():
input_tensor = Input(shape=(224,224,3))
base_model = keras.applications.resnet50(input_tensor=input_tensor,weights = 'imagenet',include_top = False)
for layer in base_model.layers:
layer.trainable = True
x = base_model.output
x = GlobalAveragePooling2D(data_format='channels_last')(x)
x = Dense(256)(x)
l2_norm_final = Lambda(lambda x: K.l2_normalize(x,axis=1))(x)
final_model = Model(inputs=base_model.input,outputs = l2_norm_final)
return final_model
model = resnet_model()
model.load_weights(weights_file_orig)
#this works i.e.,W has the model's weights
W = model.get_weights()
#this does not work i.e.,w,b have []
all_weights = [],all_biases = []
for layer in model.layers:
w,b = layer.get_weights()
all_weights.append(w)
all_biases.append(b)
'''
非常感谢!
解决方法
第一次更正:
您没有正确使用多重分配,请在下面进行更正:
all_weights = [],all_biases = [] # wrong
all_weights,all_biases = [],[] # correct way to use multi-assignment in python
第二次更正:
并非所有图层都具有权重,例如: Input , Dropout 等。因此,当您尝试获取这些图层的节点权重和偏向权重时,会出现错误,指出很少要解压缩的值,下面的代码应该可以完成工作。
for layer in model.layers:
try:
w,b = layer.get_weights()
all_weights.append(w)
all_biases.append(b)
except:
pass # not all layers have weights !
如果只想获取经过预训练的模型(res-net)的权重,则在运行上述代码之前,请先定义 model 变量,如下所示:
model = keras.applications.ResNet50(input_tensor=input_tensor,weights = 'imagenet',include_top = False)