Argumento de palabra clave inesperado 'desigual' en Keras

11

Intentando ejecutar un modelo de keras entrenado con el siguiente código de Python:

from keras.preprocessing.image import img_to_array
from keras.models import load_model

from imutils.video import VideoStream
from threading import Thread
import numpy as np
import imutils
import time
import cv2
import os

MODEL_PATH = "/home/pi/Documents/converted_keras/keras_model.h5"

print("[info] loading model..")
model = load_model(MODEL_PATH)


print("[info] starting vid stream..")
vs = VideoStream(usePiCamera=True).start()
time.sleep(2.0)

while True:
    frame = vs.Read()
    frame = imutils.resize(frame, width=400)

    image = cv2.resize(frame, (28, 28))
    image = image.astype("float") / 255.0
    image = img_to_array(image)
    image = np.expand_dims(image, axis=0)
    (fuel, redBall, whiteBall, none) = model.predict(image)[0]
    label = "none"
    proba = none

    if fuel > none and fuel > redBall and fuel > whiteBall:
        label = "Fuel"
        proba = fuel
    elif redBall > none and redBall > fuel and redBall > whiteBall:
        label = "Red Ball"
        proba = redBall
    elif whiteBall > none and whiteBall > redBall and whiteBall > fuel:
        label = "white ball"
        proba = whiteBall
    else:
        label = "none"
        proba = none

    label = "{}:{:.2f%}".format(label, proba * 100)
    frame = cv2.putText(frame, label, (10, 25),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
    cv2.imshow("Frame", frame)
    key = cv2.waitKey(1) & 0xFF

    if key == ord("q"):
        break

print("[info] cleaning up..")
cv2.destroyAllWindows()
vs.stop()

Cuando lo ejecuto con python3, aparece el siguiente error: TypeError: __init__() got an unexpected keyword argument 'ragged'

¿Qué está causando el error y cómo lo soluciono?

Versiones: Keras v2.3.1 tensorflow v1.13.1

Editar para agregar:

Traceback (most recent call last):
  File "/home/pi/Documents/converted_keras/keras-script.py", line 18, in <module>
    model = load_model(MODEL_PATH)
  File "/usr/local/lib/python3.7/dist-packages/keras/engine/saving.py", line 492, in load_wrapper
    return load_function(*args, **kwargs)
  File "/usr/local/lib/python3.7/dist-packages/keras/engine/saving.py", line 584, in load_model
    model = _deserialize_model(h5dict, custom_objects, compile)
  File "/usr/local/lib/python3.7/dist-packages/keras/engine/saving.py", line 274, in _deserialize_model
    model = model_from_config(model_config, custom_objects=custom_objects)
  File "/usr/local/lib/python3.7/dist-packages/keras/engine/saving.py", line 627, in model_from_config
    return deserialize(config, custom_objects=custom_objects)
  File "/usr/local/lib/python3.7/dist-packages/keras/layers/__init__.py", line 168, in deserialize
    printable_module_name='layer')
  File "/usr/local/lib/python3.7/dist-packages/keras/utils/generic_utils.py", line 147, in deserialize_keras_object
    list(custom_objects.items())))
  File "/usr/local/lib/python3.7/dist-packages/keras/engine/sequential.py", line 301, in from_config
    custom_objects=custom_objects)
  File "/usr/local/lib/python3.7/dist-packages/keras/layers/__init__.py", line 168, in deserialize
    printable_module_name='layer')
  File "/usr/local/lib/python3.7/dist-packages/keras/utils/generic_utils.py", line 147, in deserialize_keras_object
    list(custom_objects.items())))
  File "/usr/local/lib/python3.7/dist-packages/keras/engine/sequential.py", line 301, in from_config
    custom_objects=custom_objects)
  File "/usr/local/lib/python3.7/dist-packages/keras/layers/__init__.py", line 168, in deserialize
    printable_module_name='layer')
  File "/usr/local/lib/python3.7/dist-packages/keras/utils/generic_utils.py", line 147, in deserialize_keras_object
    list(custom_objects.items())))
  File "/usr/local/lib/python3.7/dist-packages/keras/engine/network.py", line 1056, in from_config
    process_layer(layer_data)
  File "/usr/local/lib/python3.7/dist-packages/keras/engine/network.py", line 1042, in process_layer
    custom_objects=custom_objects)
  File "/usr/local/lib/python3.7/dist-packages/keras/layers/__init__.py", line 168, in deserialize
    printable_module_name='layer')
  File "/usr/local/lib/python3.7/dist-packages/keras/utils/generic_utils.py", line 149, in deserialize_keras_object
    return cls.from_config(config['config'])
  File "/usr/local/lib/python3.7/dist-packages/keras/engine/base_layer.py", line 1179, in from_config
    return cls(**config)
  File "/usr/local/lib/python3.7/dist-packages/keras/legacy/interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'ragged'

Enlace de archivo h5 (Google Drive)

zxsq
fuente
Agregue su seguimiento completo de la pila de errores, junto con parte del código donde obtiene el error.
Vivek Mehta
@VivekMehta He agregado el código completo y el seguimiento de error, ¿creo que esto es lo que pediste? No estoy seguro, lo siento.
zxsq
"/home/pi/Documents/converted_keras/keras_model.h5"¿Es este el camino completo? Intenta darle el camino absoluto.
DuDoff
@daudnadeem Sí, ese es el camino absoluto hacia él.
zxsq
Gracias por agregar el código completo y el seguimiento de la pila. Parece que algo en generic_utils se llama con un __init __ (ragged = 'algo') pero no estoy seguro de por qué sucedería eso.
rajah9

Respuestas:

21

Así que probé el enlace anterior que ha mencionado máquina de enseñanza
Como resulta que el modelo que ha exportado es de tensorflow.kerasy no directamente de kerasAPI. Estos dos son diferentes. Entonces, mientras se carga, puede estar usando tf.ragged tensores que pueden no ser compatibles con keras API.

Solución a su problema:

no importe keras directamente ya que su modelo se guarda con la api de alto nivel keras de Tensorflow. Cambie todas sus importaciones a tensorflow.keras

Cambiar:

from keras.preprocessing.image import img_to_array
from keras.models import load_model

a esto:

from tensorflow.keras.preprocessing.image import img_to_array
from tensorflow.keras.models import load_model

Resolverá tu problema.

EDITAR:
todas sus importaciones, ya sea desde Keraso tensorflow.keras. Aunque siendo la misma API, pocas cosas son diferentes, lo que crea este tipo de problemas. También se prefiere el tensorflowbackend tf.keras, porque Keras 2.3.0 es la última versión principal que admitirá backends que no sean tensorflow.

Esta versión sincroniza la API con la API tf.keras a partir de TensorFlow 2.0. Sin embargo, tenga en cuenta que no es compatible con la mayoría de las características de TensorFlow 2.0, en particular, la ejecución ansiosa. Si necesita estas características, use tf.keras . Esta es también la última versión importante de Keras multi-backend. En adelante, recomendamos que los usuarios consideren cambiar su código Keras a tf.keras en TensorFlow 2.0.

Vivek Mehta
fuente
Esto solucionó mi problema. Muchas gracias :)
Manthan_Admane