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


[관련 포스트]

댓글

이 블로그의 인기 게시물

Keras 모델 저장(save_model) 및 불러오기 (load_model) 방법

CA-CFAR 예제 코드

python asyncio를 이용한 async socket server client example code

간단한 cfar 알고리즘에 대해

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법