ML&AI

[ML&AI] tensorflow model TFLite ๋ชจ๋ธ ๋ณ€ํ™˜ํ•˜๊ธฐ** 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'>)**

์—ฌ๋ฏธ๋ฏธ 2024. 9. 5. 16:46

 

 

๐Ÿ’ฆ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
)

 

 

 

๐Ÿฝ ๊ฐ€์žฅ ํ•™์Šต๋ฅ ์ด ๋†’์€ ์ƒํƒœ๋กœ ๋ชจ๋ธ์„ ์ €์žฅํ–ˆ๊ณ  

# ๋ฒ ์ŠคํŠธ ์—ํฌํฌ ๋ชจ๋ธ ๋กœ๋“œ
model.load_weights(checkpoint_path)

 

๋กœ์ปฌ๊ณผ ๋“œ๋ผ์ด๋ธŒ์— ๋ชจ๋‘ 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 ๋ณ€ํ™˜์„ฑ๊ณต!