model.layers [i] .get_weights返回空列表

问题描述

你好,我有下面的代码,将预先保存的自定义权重从.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)

'''

如何从保存的.cpkt文件中逐层获取权重和偏差?

非常感谢!

解决方法

第一次更正:

您没有正确使用多重分配,请在下面进行更正:

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)