람쥐썬더

[PYTHON] keras.applications 의 모델 사용하기 본문

파이썬

[PYTHON] keras.applications 의 모델 사용하기

람쥐썬더123 2022. 6. 22. 14:57

딥러닝을 위해 모델을 차근차근 쌓는것도 방법이 될 순 있지만 ( 맨날 헷갈려서 잘 못함 )

구글이라는 초 일류 세계 S급 짱짱기업에서 제공해주는 모델을 사용하는것도 하나의 방법이 될 수 있다.

 

keras documents(https://keras.io/ko/applications/)

 

를 보면 가져다 쓸 수 있는 모델들이 볼 수 있다

각 모델의 깊이와 정확성(ImageNet 기준?) 그리고 파라미터 , 사이즈 등등

그와중에 인셉션레스넷v2는 깊이 후덜덜하넹;;

 

 

 

 

사실 텐서플로에서 보는게 더 깔끔하고 많다

 

https://www.tensorflow.org/api_docs/python/tf/keras/applications

 

Module: tf.keras.applications  |  TensorFlow Core v2.9.1

Keras Applications are premade architectures with pre-trained weights.

www.tensorflow.org

직접가서 보는게 사실 도움이 제일 큰데 

 

글을 쓰는 큰 목적은 맨날 모델 가져와서 쓰려할때마다 까먹어서 저장용으로..

 

이게 모델마다 받는 인자값들이 다르기 때문에 자주쓰는 ResNet50 기준으로 저장을 해보려한다

 

from tensorflow.keras.applications import ResNet50
ResNet = ResNet50(
                    include_top=True,
                    weights='imagenet',
                    input_tensor=None,
                    input_shape=None,
                    pooling=None,
                    classes=1000
)

기본 예제를 토대로 가져온 코드이다

include_top의 경우 처음 봤을때 헷갈렸던게 찾아보니까 완전연결층을 상단에 포함한다는 개념이라서 뭘 포함한다는거지? 했는데 그냥 맨 마지막 output에 Dense층을 추가해 주는 개념이였다 (자세히는 모름 ㅋ) 사실 그냥 summary로 보면 include_bottom 이 더 낫지 않을까 싶기도 하궁;

 

input_shape과 input_tensor는 비슷한 개념인거 같은데

tensor로 지정을 할거면 keras.layers.Input(shape( h,w,c )) 형식으로 지정 해 주면 된다

근데 나는 shape으로 걍 만들었다 여태 input_shape = (512,512,3) 이런식으로;;

 

weights는 말그대로 가중치 'imagenet'을 지정하면 이미지넷 학습했던 가중치가 포함되게 된다

커스텀 weights를 넣을거면 같은 shape을 가진 모델의 weights를 파일로 저장해두고 경로를 지정해주면 된다

(이거 좀 헷갈리는데 지정할때 모델 모양이 다르면 안된다 그래서 모델을 다 만들어두고 load_weights로 가중치를 불러왔었음)

 

pooling은 inclide_top = False 일때 마지막 pooling 층을 멀로 설정할지 적어주면댄다 ( 'avg' , 'max' , None )

 

classes는 마지막 완전연결층이 있다 쳤을때 최종적으로 뽑아줄 output 갯수를 의미한다  이미지넷이 1000개라 1000이 기본으로 돼있나부다

 

 

이건 이미지넷 학습되어 있는 모델 불러오는 base고 

이 ResNet50 을 backbone으로 하는 커스텀 모델을 만들어 보고자 한다

 

from tensorflow.keras.applications import ResNet50
from tensorflow.keras.layers import Conv2D, Dense, MaxPooling2D, Dropout, Flatten, BatchNormalization, GlobalAveragePooling2D
from tensorflow.keras import Model

img_size= 512

backbone = ResNet50(input_shape=(img_size, img_size, 3),
                      weights= None,
                      include_top=False)

model = backbone.output

model = GlobalAveragePooling2D()(model)
model = BatchNormalization()(model)
model = Dense(256, activation='relu')(model)

output = Dense(units=10, activation=None, name='output_layer')(model)
resnet_custom = Model(inputs=backbone.input, outputs=output)

resnet_custom.compile(optimizer='adam',
			loss='categorical_crossentropy',
                      metrics='accuracy')

 

backbone = ResNet50으로 input_shape을 지정해주고

 

weights는 받지 않았다 ( 가중치 처음부터 학습할거라서 )

 

마지막 완전 연결층도 직접 쌓아줄 것이기 때문에 False로 뒀다 ( 생각해보니까 모델 쌓는거니까 마지막에 쌓아주는 Output이 Top이 맞네 헉 , include_top 이 맞다 ㄷㄷ )

 

이후 model 변수를 backbone의 output으로 지정해주고

그 밑에  GAP, BN, Dense 차곡 차곡 올려준다

 

이후 keras.Model 을 이용하여

inputs에는 backbone.input

outputs 에는 방금 쌓아준 output을 넣어주면 모델이 완성이 된다

 

 

그리고 컴파일하고 학습하면 끝!