Модель.layers[i].get_weights() возвращает пустой список

#keras #keras-layer

#keras #keras-layer

Вопрос:

Привет, у меня есть приведенный ниже код, в котором я загружаю предварительно сохраненные пользовательские веса из файла .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?

Большое спасибо!

Комментарии:

1. Какой слой не возвращает веса? Вы должны учитывать, что не все слои имеют веса.

2. Ни один из слоев. Все они возвращают пустые списки.

Ответ №1:

первое исправление :

вы неправильно используете множественное присвоение, исправление упомянуто ниже :

 all_weights = [], all_biases = [] # wrong
all_weights, all_biases = [], [] # correct way to use multi-assignment in python
  

второе исправление:

не все слои имеют веса, например: входные, выпадающие и т. Д. поэтому, когда вы пытаетесь получить как веса узлов, так и веса смещения этих слоев, у вас будет ошибка, указывающая на несколько значений для распаковки, приведенный ниже код должен выполнить работу.

 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 = keras.applications.ResNet50(input_tensor=input_tensor,weights = 'imagenet', include_top = False)