1
votes

"La première couche d'un modèle séquentiel doit avoir un argument` inputShape` ou `batchInputShape`." lors du chargement du modèle Keras avec TensorFlow.js

J'ai formé le modèle suivant à l'aide de Keras (version 2.2.4):

The first layer in a Sequential model must get an `inputShape` or `batchInputShape` argument.
    at new e (errors.ts:48)
    at e.add (models.ts:440)
    at e.fromConfig (models.ts:1020)
    at vp (generic_utils.ts:277)
    at nd (serialization.ts:31)
    at models.ts:299
    at common.ts:14
    at Object.next (common.ts:14)
    at o (common.ts:14)

Les entrées sont des images 28 x 28 en niveaux de gris de forme (28, 28, 1) .

 Présentation du modèle

J'ai converti le modèle avec tensorflowjs_converter et maintenant je veux chargez-le dans mon site Web en utilisant TensorFlow.js (version 1.1.0):

XXX

Cela produit l'erreur suivante:

tf.loadLayersModel('./model/model.json')

Comment puis-je corriger cette erreur sans avoir à recycler le modèle?

p>


5 commentaires

Je ne pense pas qu'il soit possible d'entraîner votre modèle si vous n'avez pas défini de forme d'entrée


@Primusa La formation a fonctionné et comme vous pouvez le voir sur l'image ci-dessus, la bonne forme d'entrée a été dérivée correctement.


essayez d'exécuter votre code de définition de modèle et compilez / entraînez-le sur des données factices


@Primusa J'ai fait ça, et ça a marché. La perte a diminué et le fichier model.h5 a été créé. Si cela n'avait pas fonctionné, je n'aurais pas pu convertir le modèle.


essayez peut-être d'enregistrer les poids avec model.save_weights , puis de faire model.load_weights sur une architecture dont la forme d'entrée est définie, puis d'enregistrer ce modèle et de convertir


3 Réponses :


0
votes

Essayez d'ajuster votre réseau neuronal à ce format:

model = Model(inputs = input_img, outputs = final_layer)

... et ainsi de suite. À la fin:

input_img = Input(batch_shape=(None, 28,28,1))
layer1=Conv2D(filters=64, kernel_size=5, data_format="channels_last", activation="relu")(input_img)
layer2=BatchNormalization()(layer1)
.
.
.
final_layer=Dense(units=8, activation="softmax")(previous_layer)


2 commentaires

Pourriez-vous élaborer, je ne suis pas tout à fait clair? Dois-je à nouveau entraîner le modèle? Cela ne peut-il pas être résolu dans le code JavaScript?


Vous devez ajuster le code python, puis convertir le modèle en TensorFlow.js



0
votes

Vous devez spécifier la forme d'entrée dans la couche Conv2D de votre modèle keras.

# imports ...
model = Sequential()
model.add(Conv2D(input_shape=(28, 28, 1), filters=64, kernel_size=5, data_format="channels_last", activation="relu"))
model.add(BatchNormalization())
model.add(MaxPooling2D(data_format="channels_last"))
model.add(Conv2D(filters=32, kernel_size=3, data_format="channels_last", activation="relu"))
model.add(BatchNormalization())
model.add(MaxPooling2D(data_format="channels_last"))
model.add(Flatten(data_format="channels_last"))
model.add(Dense(units=256, activation="relu"))
model.add(Dense(units=128, activation="relu"))
model.add(Dense(units=32, activation="relu"))
model.add(Dense(units=8, activation="softmax"))
# training ...
model.save("model.h5")


1 commentaires

Je sais que j'aurais dû le faire de cette façon en premier lieu. Mais la question était de savoir si je pouvais résoudre le problème par la suite, car je ne voulais pas entraîner à nouveau le modèle. Mais c'est fini de toute façon, car j'ai dû changer l'architecture du modèle en raison d'un surajustement. Je ne cherche donc plus de solution.



0
votes

La meilleure approche consiste à modifier votre modèle de keras et à vous recycler.

Quoi qu'il en soit, si vous ne pouvez pas recycler votre réseau, vous pouvez modifier manuellement votre fichier model.json .

Vous devez trouver la couche d'entrée dans votre fichier model.json et ajouter

  "config": {
    ...
    "batch_input_shape": [
      null,
      28,
      28,
      1
    ]
    ...
  }


0 commentaires