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


[관련 포스트]

댓글

이 블로그의 인기 게시물

간단한 cfar 알고리즘에 대해

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

간단한 칼만 필터(Kalman Filter) 소스 코드와 사용 예제

안드로이드(android) 전체 화면 시계 앱(clock app) 예제 코드

mkfs.fat Device or resource busy 에러 해결법