๐ฆtensorflow ๋ฒ์ 2.17.0 ๋ฒ์ ์ ์ฌ์ฉ์ค
*๏ธโฃ ๋ชจ๋ฐ์ผ์ฅ์น์ ์ง์ ๋ฃ๊ธฐ ์ํด ๊ฒฝ๋ํ๋ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ธ MobileNet-MobileNetV3Small ์ฌ์ฉ
๐ฅฆ ํน์ง : ๊ฐ๋ณ๊ณ ๊ณ์ฐ๋์ด ์ ๋ค
๐ฅฆ ์์ ํฌ๊ธฐ์ ๋น ๋ฅธ์๋๋ฅผ ์ ์งํ๋ฉด์ ์ด๋ฏธ์ง ๋ถ๋ฅ ์์ ์ ๋ฐ์ด๋ ์ฑ๋ฅ ๋ฐํ๊ฐ๋ฅ
https://www.tensorflow.org/api_docs/python/tf/keras/applications/MobileNetV3Small
tf.keras.applications.MobileNetV3Small | TensorFlow v2.16.1
Instantiates the MobileNetV3Small architecture.
www.tensorflow.org
tf.keras.applications.MobileNetV3Small(
input_shape=None, #์ด๋ฏธ์ง ํฌ๊ธฐ ์๋์ค์ - ์ผ๋ฐ์ ์ผ๋ก (224,224,3)
alpha=1.0, #๋ชจ๋ธํฌ๊ธฐ์ ์ฑ๋ฅ์กฐ์ -> ๊ฐ์ด ๋ฎ์์ง์๋ก ์๊ณ ๋น ๋ฅด๋ฉฐ ์ฑ๋ฅ์ด ๋ฎ์์ง
minimalistic=False,
include_top=True, #์ต์๋จ ๋ถ๋ฅ๋ ์ด์ด ํฌํจ์ํฌ์ง - True: 1000๊ฐ์ ํด๋์ค ๋ถ๋ฅํ๋ ๋ ์ด์ด ํฌํจ
weights='imagenet',
input_tensor=None,
classes=1000,
pooling=None,
dropout_rate=0.2, #๊ณผ์ ํฉ ๋ฐฉ์ง - ๋ด๋ฐ์ ๋ฌด์์๋ก ๋นํ์ฑํํ๋ ๋น์จ์ค์
classifier_activation='softmax',
include_preprocessing=True
)
๐ฝ ๊ฐ์ฅ ํ์ต๋ฅ ์ด ๋์ ์ํ๋ก ๋ชจ๋ธ์ ์ ์ฅํ๊ณ
๋ก์ปฌ๊ณผ ๋๋ผ์ด๋ธ์ ๋ชจ๋ check point๋ฅผ ์ ์ฅํด๋ณด์๋ค
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
checkpoint_path = "/checkpoint/BadSoreScan_model.weights.h5"
drive_checkpoint_path = "/content/drive/MyDrive/develop/model/curesilk_checkpoint.weights.h5"
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,
save_weights_only=True,
save_best_only = True,
verbose=1)
# ๋ก์ปฌ ๊ฒฝ๋ก์ ๊ฐ์ค์น ์ ์ฅ
model.save_weights(checkpoint_path)
# Google Drive์ ๊ฐ์ค์น ์ ์ฅ
model.save_weights(drive_checkpoint_path)
model.summary()
history = model.fit(train_ds, epochs=20, validation_data = val_ds, callbacks=[cp_callback])
โบ๏ธ ๋ง์ดํธ๋ ๊ตฌ๊ธ ๋๋ผ์ด๋ธ์ ์ ์ฅ๋ ๋ชจ๋ธ์ ๋ถ๋ฌ์์ tflite๋ก ๋ณํํ๋์ค์ ์๊ธด ๋ฌธ์ ์๋ค
๊ตฌ๊ธ ๋๋ผ์ด๋ธ ์ชฝ์์ ๋ชจ๋ธ ํ์ผ์ ๋ถ๋ฌ์ฌ๋ ๋ฌธ์ ๊ฐ ๊ฐ๋ฉด์ ์๊ฒผ๋๋ฐ ์ ๋ชฉ์ ์๋ฏ์ด ์ด๋ถ๋ถ์์ ๊ณ์ ๋ฌธ์ ๊ฐ ๋ฒ๊ฐ๋ผ ๊ฐ๋ฉด ์๊ฒผ๋ค
model_flower = tf.keras.models.load_model(model_path,compile=False)
error ๋ด์ฉ
ValueError: Only input tensors may be passed as positional arguments. The following argument value should be passed as a keyword argument: 3.0 (of type <class 'float'>)
AttributeError: type object 'TFLiteConverterV2' has no attribute 'from_keras_model_file'
๋ฒ์ ๋ฌธ์ ๋ก ํ ์ ๊ฐ ๋ค์ด์์ผํ๋ ์๋ฆฌ์ float ๊ฐ ์ ๋ ฅ๋๋ค๊ณ ๋ ํด์ ๋ชจ๋ธ ํ์ต์ค ๋ฒ์ ์ ๋ง์ง ์๋ ํ์์ด ๋ค์ด๊ฐ๊ฑฐ ๊ฐ์ ๋ ์ด์ด๋ฅผ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝํ๊ธฐ๋ ํ๋ค ์ค์๊ฐ ๋ค์ด๊ฐ๋ ์๋ฆฌ๋ ์ ๊ธฐ ๋ฐ์ ์๋ค๊ณ ์๊ฐ์ด ๋ค์๊ธฐ ๋๋ฌธ ๐ฅฒ ํ์ง๋ง ํด๊ฒฐ๋์ง ์์๊ณ
# ๋ณ๊ฒฝ์
dr1 = layers.Dropout(0.4)
dense1 = layers.Dense(128)
dr2 = layers.Dropout(0.4)
dense2 = layers.Dense(64)
dr3 = layers.Dropout(0.3)
# ๋ณ๊ฒฝํ
dr1 = layers.Dropout(rate=0.4)
dense1 = layers.Dense(units=128)
dr2 = layers.Dropout(rate=0.4)
dense2 = layers.Dense(units=64)
dr3 = layers.Dropout(rate=0.3)
๋ฌธ์ ๊ฐ ๊ณ์ ๋ฐ์ํด HDF5(.h5) ํฌ๋ฉง๊ณผ SavedModelํฌ๋ฉง TensorFlow Lite ๋ก ๋ณํํ ๋ ๋ฐฉ๋ฒ์ด ์กฐ๊ธ ๋ค๋ฅด๋ค๋๊ฑธ ์๊ฒ ๋๋ค
๐ .h5 -> tensorLite
โ๏ธHDF5๋ก๋๋ TensorFlow Lite๋ฅผ ์ง์ ๋ณํํ ์ ์์ง๋ง SavedModel ์ด ํธํ์ฑ์ด ๋ ์ข๋ค๊ณ ํ๋ค
โ๏ธ.h5: ๋ชจ๋ธ ์ํคํ ์ฒ,๊ฐ์ค์น ๋ฑ ์ ์ฅ ๋๋ฉฐ ๊ฐ๋จํ ํฌ๋ฉง์ผ๋ก ๊ณต์ ํ๊ธฐ ์ ์ฉํ๊ณ Keras ์ ์ฅ๋ฐฉ์
โ๏ธ๋ชจ๋ธ์ ๋ก๋ํํ ์ถ๊ฐ ํ๋ จ ๊ณ์ ๊ฐ๋ฅ
import tensorflow as tf
# ๋ชจ๋ธ ์ ์ฅ (HDF5 ํฌ๋งท)
model.save('/content/drive/MyDrive/develop/model/BadSoreScan_model.h5')
# HDF5 ํฌ๋งท์ผ๋ก ์ ์ฅ๋ ๋ชจ๋ธ์ TensorFlow Lite๋ก ๋ณํ
converter = tf.lite.TFLiteConverter.from_keras_model_file('/content/drive/MyDrive/develop/model/BadSoreScan_model.h5')
tflite_model = converter.convert()
# TFLite ๋ชจ๋ธ ์ ์ฅ
with open('model.tflite', 'wb') as f:
f.write(tflite_model)
โญ๏ธ from_keras_model_file ์ ์ฌ์ฉํ์ฌ Convert
๐savedModel -> tensorLite
โ๏ธsavedModel: ํฌ๊ด์ ์ผ๋ก ๋๋ง์ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์์
โ๏ธ๋ฐฐํฌ์ฉ๋ ์ ๋ฆฌ
import tensorflow as tf
import os
# SavedModel ํฌ๋งท์ผ๋ก ๋ชจ๋ธ ์ ์ฅ
saved_model_path = '/content/drive/MyDrive/develop/model/RSP_model'
os.makedirs(saved_model_path, exist_ok=True)
model.save(saved_model_path)
# SavedModel ํฌ๋งท์ผ๋ก ์ ์ฅ๋ ๋ชจ๋ธ์ TensorFlow Lite๋ก ๋ณํ
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_path)
tflite_model = converter.convert()
# TFLite ๋ชจ๋ธ ์ ์ฅ
with open('model.tflite', 'wb') as f:
f.write(tflite_model)
โญ๏ธ from_saved_model ์ ์ฌ์ฉํ์ฌ Convert
๐ ๋๋ ๊ธฐ์กด์ .h5๋ง ์ ์ฅํด๋์ ์ํ๋ผ ์ด์ฉ๋ฉด ์ด๋ฐ์ ๋ฐ ๋ฐฉ๋ฒ์ ์จ๋ณด๋ฉด์ ๋ญ๊ฐ ๊ผฌ์ฌ ์์๊บผ๋ ์๊ฐ์ด ๋ค์๋ค
๐savedModel ์ ์ฅ์ variables/ ,assets/ ๊ณผ ๊ฐ์ ๋๋ ํ ๋ฆฌ๊ฐ ํฌํจ๋๊ธฐ ๋๋ฌธ์ .h5 ์ ๋ค๋ฅธ ๋๋ ํ ๋ฆฌ ์์ฑ์ ์ถ์ฒ
import os
# ๋ฒ ์คํธ ์ํฌํฌ ๋ชจ๋ธ ๋ก๋
model.load_weights(checkpoint_path)
# ๋๋ ํ ๋ฆฌ ์์ฑ - ๋ฃจํธ ๋๋ ํ ๋ฆฌ
m_path = '/content/drive/MyDrive/develop/model'
os.makedirs(m_path, exist_ok=True)
# .h5 ์ ์ฅ
h5_path = f"{m_path}/model.h5"
model.save(h5_path)
# .pb ์ ์ฅ
saved_model_path = f"{m_path}/pd" #pd_model ๋๋ ํ ๋ฆฌ ์์ฑ
os.makedirs(saved_model_path, exist_ok=True)
tf.saved_model.save(model, saved_model_path)
#h5-> TFLite ๋ณํ
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_h_model = converter.convert()
# SavedModel->TFLite ๋ณํ
converter_sv = tf.lite.TFLiteConverter.from_saved_model(saved_model_path) # from_saved_model ์ฌ์ฉ
tflite_sm_model = converter_sv.convert()
tflite_path = f"{m_path}/model.tflite"
with open(tflite_path, 'wb') as f:
f.write(tflite_sm_model)
# .h5 ํ์ผ ๋ค์ด๋ก๋
files.download(h5_path)
# SavedModel ํด๋ ์์ถ ๋ฐ ๋ค์ด๋ก๋
zip_path = '/content/SP_model.zip'
shutil.make_archive('/content/SP_model', 'zip', saved_model_path)
files.download(zip_path)
# .tflite ํ์ผ ๋ค์ด๋ก๋
files.download(tflite_path)
๐ช model.tflite ๋ณํ์ฑ๊ณต!