[TFLite] 4(4). 텐서플로 허브
텐서플로 허브
모델 선택
텐서플로 허브는 머신러닝 모델을 업로드하고 공유하는 저장소입니다. 텐서플로 허브를 이용하면 더욱 다양한 최신 사전 학습 모델을 이용할 수 있습니다.
텐서플로 허브 메인 페이지의 중앙 상단에서 원하는 모델을 검색할 수도 있고, 왼쪽 메뉴의 Problem Domains에서 해결하고자 하는 문제의 도메인을 바탕으로 모델을 찾을 수도 있습니다. 또는 Model format에서 원하는 모델의 형식에 따라 찾을 수도 있습니다.
텐서플로 허브 외에도 다음 표와 같은 사이트에서 모델과 데이터를 찾을 수 있습니다.
<표> ### 모델 개발 ##### 1. 텐서플로 허브에서 모델 선택 먼저 텐서플로 허브에 접속하여 MobileNet V2 모델을 가져옵니다. [Problem domains - Image] - [Architecture - MobileNet V2] - [상단 검색 창 - mobilenet_v2_100_224] - feature_vector 모델을 선택합니다. 모델을 사용하기 위해 URL을 이용하여 코드에서 불러오거나 직접 다운로드 할 수 있습니다. URL에서 모델을 가져오기 위해 < Copy URL >을 클릭하여 URL을 복사합니다. ✋ mobilenet_v2 뒤에 붙는 100(1.00을 나타냄)과 224는 각각 합성곱 연산에 사용하는 depth multiplier 값과 이미지의 크기 값입니다. depth multiplier 값이 작을수록 모델의 속도가 빠르지만 정확도는 떨어집니다. ✋ feature_vector 모델은 전이 학습이 가능하도록 마지막 레이어를 제거한 모델이고 classfication 모델은 바로 분류가 가능한 전체 모델입니다. ✋ 모델 선택 창 안에는 모델에 대한 여러 정보들이 있습니다. 이 중 Usage에서는 입력 값이 [0,1] 범위이고 입력 이미지의 크기가 224x224 임을 알려주는데, 여기에 맞게 구현해야 합니다. ##### 2. 데이터셋 준비 모델 URL을 확보했으니 이제 재학습에 사용할 개와 고양이 이미지 데이터를 불러옵니다. ```python import tensorflow_datasets as tfds tfds.disable_progress_bar() # 다운로드 로그 출력 비활성화 raw_train, raw_test = tfds.load( 'cats_vs_dogs', # 데이터명 split=['train[:80%]', 'train[:20%]'], # 데이터 분리 as_supervised=True) # 데이터의 형태 ``` 이미지 데이터를 전처리합니다. ```python import numpy as np import tensorflow as tf from tensorflow.image import ResizeMethod def preprocess(image, label): out_image = tf.image.resize(image/255, [224,224]) return out_image, label # 전이학습 때 코드 # out_image = tf.image.resize(image, [96,96], method=ResizeMethod.BICUBIC) # out_image = tf.keras.applications.mobilenet_v2.preprocess_input(out_image) # return out_image, label batch_size = 32 train_batch = raw_train.map(preprocess).batch(batch_size) test_batch = raw_test.map(preprocess).batch(batch_size) ``` 텐서플로 허브는 케라스 애플리케이션처럼 전처리 함수를 제공하지 않습니다. 따라서 모델에서 요구하는 스펙에 맞게 직접 데이터를 전처리해야 합니다. ##### 3. 모델 생성 및 평가 이제 tensorflow-hub 모듈을 이용하여 모델을 생성합니다. tensorflow_hub 라이브러리가 설치되어 있지 않다면 먼저 설치합니다. ```python # pip install tensorflow-hub ``` ```python import tensorflow_hub as hub url = "https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/5" hub_model_transfer = tf.keras.Sequential([ hub.KerasLayer(url, input_shape=(224,224,3), trainable=False), tf.keras.layers.Dense(1) ]) ``` 모델이 생성되면 모델을 컴파일하고 학습을 시작합니다. 학습에 필요한 인자는 모두 '전이 학습'의 코드와 동일하게 지정했습니다. ```python hub_model_transfer.compile(optimizer='adam', loss='binary_crossentropy', # 이진 분류 metrics=['accuracy']) hub_model_transfer.fit(train_batch, epochs=5) ``` Epoch 1/5 582/582 [==============================] - 27s 38ms/step - loss: 0.4641 - accuracy: 0.9497 Epoch 2/5 582/582 [==============================] - 22s 37ms/step - loss: 0.2020 - accuracy: 0.9798 Epoch 3/5 582/582 [==============================] - 22s 38ms/step - loss: 0.1857 - accuracy: 0.9818 Epoch 4/5 582/582 [==============================] - 22s 37ms/step - loss: 0.2057 - accuracy: 0.9817 Epoch 5/5 582/582 [==============================] - 21s 36ms/step - loss: 0.1738 - accuracy: 0.9836 <tensorflow.python.keras.callbacks.History at 0x1f307202880> 학습이 완료되면 테스트 데이터를 이용하여 모델의 추론 결과를 평가합니다. ```python hub_model_transfer.evaluate(test_batch, verbose=2) ``` 146/146 - 6s - loss: 0.1472 - accuracy: 0.9869 [0.14722169935703278, 0.9868873357772827] 표>
Leave a comment