โหลดน้ำหนักสำหรับเลเยอร์สุดท้าย (เลเยอร์เอาต์พุต) ไปยังโมเดลใหม่จากเครือข่ายที่ได้รับการฝึกฝน

Aug 18 2020

เป็นไปได้ไหมที่จะโหลดน้ำหนักไปยังเลเยอร์สุดท้ายในโมเดลใหม่ของฉันจากเครือข่ายที่ผ่านการฝึกอบรมโดยใช้ set_weights และ get_weights ประเด็นคือฉันบันทึกน้ำหนักของแต่ละเลเยอร์เป็นไฟล์ mat (หลังการฝึก) เพื่อทำการคำนวณใน Matlab และฉันต้องการเพียงแค่น้ำหนักที่แก้ไขของเลเยอร์สุดท้ายเท่านั้นที่จะโหลดไปยังเลเยอร์สุดท้ายในโมเดลใหม่ของฉันและเลเยอร์อื่น ๆ รับน้ำหนักเท่ากันกับแบบจำลองที่ได้รับการฝึกฝน เป็นบิตที่สามเนื่องจากรูปแบบที่บันทึกไว้เป็นเสื่อ

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})  

ฉันจะโหลดเฉพาะน้ำหนักเก่าของเลเยอร์อื่นไปยังโมเดลใหม่ (โดยไม่มีเลเยอร์สุดท้าย) และน้ำหนักที่ปรับเปลี่ยนของเลเยอร์สุดท้ายไปยังเลเยอร์สุดท้ายในเลเยอร์ใหม่ได้อย่างไร

คำตอบ

1 RyanRudes Aug 24 2020 at 13:41

หากบันทึกเป็นรูปแบบไฟล์. h5 สิ่งนี้จะใช้ได้ อย่างไรก็ตามฉันไม่แน่ใจเกี่ยวกับ. mat:

ในความเรียบง่ายคุณต้องเรียกget_weightsใช้เลเยอร์ที่ต้องการและในทำนองเดียวกันset_weightsบนเลเยอร์ที่สอดคล้องกันของโมเดลอื่น:

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

สำหรับตัวอย่างโค้ดที่สมบูรณ์ยิ่งขึ้นไปที่นี่:

# 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