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)
.
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>
3 Réponses :
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)
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
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")
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.
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 ] ... }
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 fairemodel.load_weights
sur une architecture dont la forme d'entrée est définie, puis d'enregistrer ce modèle et de convertir