Keras 모델 가중치 weights 파라미터 가져오기 설정하기 저장하기 및 불러오기
Keras 모델의 가중치(weights) 파라메터 검색, 설정, 저장 및 불러오기 정리 관련 포스트다.
keras model에서 가중치(weights) 가져오기
Model.get_weights()
return:
- 모델의 가중치 배열
Keras model에 가중치(weights) 설정하기
Model.set_weights(weights)
argument:
- weights : numpy 배열의 가중치
Keras model의 가중치(weights) 파일로 저장하기
Model.save_weights(filepath, overwrite=True)
arguments:
- filepath : 저장할 파일 경로, HDF5 형식으로 저장된다.
- overwrite : 덮어쓰기 여부
파일에서 Keras model 가중치(weights) 불러와 설정하기
Model.load_weights(filepath, by_name=False, skip_mismatch=False, reshpae=False)
arguments:
- filepath : 가중치 파일의 경로
- by_name : 이름 또는 토폴로지 순서로 가중치를 로드 할지 여부를
나타낸다.
- skip_mismath : 가중치 개수나 모양이 일치하지 않는 레이어를 건너 뛸지에
대한 여부를 나타낸다. (by_name이 True인 경우)
- reshape : reshape 여부를 나타냄
예제 코드
from keras.layers import Input, Dense, Dropout, regularizers
from keras.models import Model, load_model, save_model
from keras.optimizers import Adam
def build_model(in_size, out_sizes, depth=2, layer_units = 128, lr=0.01):
in_layer = Input(shape=(in_size,),name='input_layer')
prev = in_layer
for fc in range(depth):
prev = Dense(units=layer_units,
activation='relu', kernel_regularizer=regularizers.l2(l=0.01),
name='dense%d'%fc)(prev)
prev = Dropout(0.1,name='droupout%d'%fc)(prev)
out_layer = Dense(out_sizes,activation='softmax',
kernel_regularizer=regularizers.l2(l=0.01), name='out_layers')(prev)
model = Model(inputs=[in_layer],outputs=[out_layer])
optimizer = Adam(lr=lr)
model.compile(loss='mean_squared_error',
optimizer=optimizer,metrics=['accuracy'])
return model
def excode_get_set_weight():
print('excode_get_set_weight')
model1 = build_model(2,2,layer_units=2,depth=1)
model2 = build_model(2,2,layer_units=2,depth=1)
print('before')
print('model1 :', model1.get_weights())
print('model2 :', model2.get_weights())
model1.set_weights(model2.get_weights())
print('after')
print('model1 :', model1.get_weights())
print('model2 :', model2.get_weights())
del model1
del model2
def excode_save_weight(weight_path):
print('excode_save_weight')
model = build_model(2,2,layer_units=2,depth=1)
print('model weight :', model.get_weights())
model.save_weights(filepath=weight_path,overwrite=True)
del model
def excode_load_weight(weight_path):
print('excode_load_weight')
model = build_model(2,2,layer_units=2,depth=1)
print('model weight :', model.get_weights())
model.load_weights(filepath=weight_path)
model.load_weights()
print('after load_weights model weight :',
model.get_weights())
del model
if __name__ == "__main__":
excode_get_set_weight()
excode_save_weight('model_weights.h5')
excode_load_weight('model_weights.h5')
실행 결과
model1, model2 두개의 모델을 만들어 각각의 가중치를 출력한 결과다.
before
model1 :
[array([[ 0.2364167 , 0.88603175],
[ 0.90756714, -1.0964375 ]], dtype=float32),
array([0., 0.], dtype=float32), array([[ 1.1414999 , 0.77426684],
[ 0.63132596, -1.007914 ]],
dtype=float32), array([0., 0.], dtype=float32)]
model2 : [array([[-1.1494689 , -1.0712395 ],
[-0.12987018, 0.4888729 ]],
dtype=float32), array([0., 0.], dtype=float32), array([[-1.1910785 ,
1.0730509 ],
[-0.18443692, 0.29470563]],
dtype=float32), array([0., 0.], dtype=float32)]
get_weight를 통해 받아온 model2의 가중치를 set_weights를 사용해 model1에 설정하면 아래와 같이 model1의 가중치가 model2의 가중치와 같이 변한 것을 볼 수 있다.
after
model1 : [array([[-1.1494689 , -1.0712395 ],
[-0.12987018, 0.4888729 ]],
dtype=float32), array([0., 0.], dtype=float32), array([[-1.1910785 ,
1.0730509 ],
[-0.18443692, 0.29470563]],
dtype=float32), array([0., 0.], dtype=float32)]
model2 : [array([[-1.1494689 , -1.0712395 ],
[-0.12987018, 0.4888729 ]],
dtype=float32), array([0., 0.], dtype=float32), array([[-1.1910785 ,
1.0730509 ],
[-0.18443692, 0.29470563]],
dtype=float32), array([0., 0.], dtype=float32)]
model을 만들어 가중치를 파일로 저장하면 아래 그림처럼 HDF5 형식의 파일이 생성된다.
excode_save_weight
model weight :
[array([[-0.03750205, -1.1496917 ],
[-0.40425277, 0.99050415]],
dtype=float32), array([0., 0.], dtype=float32), array([[ 0.05072594,
-0.87032056],
[ 0.63384914, -0.36687708]], dtype=float32),
array([0., 0.], dtype=float32)]
모델을 생성하고, excode_save_weight에서 저장된 파일에서 가중치를 불러와 모델에 로드 하면 아래와 같이 지정한 파일의 가중치로 설정된 것을 볼 수 있다.
excode_load_weight
model weight :
[array([[-0.31643784, -0.08562171],
[-0.31086147, -0.70721614]], dtype=float32),
array([0., 0.], dtype=float32), array([[ 0.08954179, 0.15135777],
[-0.33166134, 1.1615216 ]],
dtype=float32), array([0., 0.], dtype=float32)]
after load_weights model weight :
[array([[-0.03750205, -1.1496917 ],
[-0.40425277, 0.99050415]],
dtype=float32), array([0., 0.], dtype=float32), array([[ 0.05072594,
-0.87032056],
[ 0.63384914, -0.36687708]], dtype=float32),
array([0., 0.], dtype=float32)]
[관련 포스트]
댓글
댓글 쓰기