Eğitimli ağdan yeni bir modele son katman (çıktı katmanı) için ağırlıkları yükleyin

Aug 18 2020

Yeni modelimdeki son katmana set_weights ve get_weights şemasını kullanarak eğitilmiş ağdan ağırlık yüklemek mümkün müdür? Mesele şu ki, Matlab'da bir miktar hesaplama yapmak için her katmanın ağırlığını bir mat dosyası olarak (eğitimden sonra) kaydettim ve sadece son katmanın değiştirilmiş ağırlıklarının yeni modelimde ve diğer katmanlarda son katmana yüklenmesini istiyorum. eğitimli modelle aynı ağırlıkları alın. Kaydedilen format mat olduğu için biraz yanıltıcıdır.

weights1 = lstm_model1.layers[0].get_weights()[0]
biases1 = lstm_model1.layers[0].get_weights()[1]
weights2 = lstm_model1.layers[2].get_weights()[0]
biases2 = lstm_model1.layers[2].get_weights()[1]
weights3 = lstm_model1.layers[4].get_weights()[0]
biases3 = lstm_model1.layers[4].get_weights()[1]
# Save the weights and biases for adaptation algorithm 
savemat("weights1.mat", mdict={'weights1': weights1})  
savemat("biases1.mat", mdict={'biases1': biases1})      
savemat("weights2.mat", mdict={'weights2': weights2})   
savemat("biases2.mat", mdict={'biases2': biases2})      
savemat("weights3.mat", mdict={'weights3': weights3}) 
savemat("biases3.mat", mdict={'biases3': biases3})  

Diğer katmanların yalnızca eski ağırlıklarını yeni modele (son katman olmadan) ve son katmanın değiştirilmiş ağırlıklarını yenisindeki son katmana nasıl yükleyebilirim?

Yanıtlar

1 RyanRudes Aug 24 2020 at 13:41

.H5 dosya biçiminde kaydedilmişse, bu çalışır. Ancak, .mat hakkında emin değilim:

Basitçe söylemek gerekirse, sadece get_weightsistenen katmanı ve benzer şekilde set_weightsdiğer modelin karşılık gelen katmanını çağırmanız gerekir :

last_layer_weights = old_model.layers[-1].get_weights()
new_model.layers[-1].set_weights(last_layer_weights)

Daha eksiksiz bir kod örneği için şuraya gidin:

# Create an arbitrary model with some weights, for example
model = Sequential(layers = [
    Dense(70, input_shape = (100,)),
    Dense(60),
    Dense(50),
    Dense(5)])

# Save the weights of the model
model.save_weights(“model.h5”)

# Later, load in the model (we only really need the layer in question)
old_model = Sequential(layers = [
    Dense(70, input_shape = (100,)),
    Dense(60),
    Dense(50),
    Dense(5)])

old_model.load_weights(“model.h5”)

# Create a new model with slightly different architecture (except for the layer in question, at least)
new_model = Sequential(layers = [
    Dense(80, input_shape = (100,)),
    Dense(60),
    Dense(50),
    Dense(5)])

# Set the weights of the final layer of the new model to the weights of the final layer of the old model, but leaving other layers unchanged.
new_model.layers[-1].set_weights(old_model.layers[-1].get_weights())

# Assert that the weights of the final layer is the same, but other are not.
print (np.all(new_model.layers[-1].get_weights()[0] == old_model.layers[-1].get_weights()[0]))
>> True

print (np.all(new_model.layers[-2].get_weights()[0] == old_model.layers[-2].get_weights()[0]))
>> False