Memuat bobot untuk lapisan terakhir (lapisan keluaran) ke model baru dari jaringan terlatih
Apakah mungkin untuk memuat bobot ke lapisan terakhir dalam model baru saya dari jaringan terlatih dengan menggunakan skema set_weights dan get_weights? Intinya adalah, saya menyimpan bobot setiap lapisan sebagai file mat (setelah pelatihan) untuk membuat beberapa perhitungan di Matlab dan saya hanya ingin bobot yang dimodifikasi dari lapisan terakhir dimuat ke lapisan terakhir dalam model baru saya dan lapisan lainnya. mendapatkan bobot yang sama dengan model yang dilatih. Agak rumit, karena format yang disimpan adalah mat.
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})
Bagaimana cara memuat hanya bobot lama dari lapisan lain ke model baru (tanpa lapisan terakhir) dan bobot yang dimodifikasi dari lapisan terakhir ke lapisan terakhir di yang baru?
Jawaban
Jika itu disimpan sebagai format file .h5, ini berfungsi. Namun, saya tidak yakin tentang .mat:
Sederhananya, Anda hanya perlu memanggil get_weights
lapisan yang diinginkan, dan demikian pula, set_weights
pada lapisan yang sesuai dari model lain:
last_layer_weights = old_model.layers[-1].get_weights()
new_model.layers[-1].set_weights(last_layer_weights)
Untuk contoh kode yang lebih lengkap, ini dia:
# 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