J'essaie d'affiner et d'enregistrer un modèle dans Keras et de le charger, mais j'obtiens cette erreur:Value Error: You are trying to load a weight file containing 16 layers into a model with 0 layers.
.
Je veux charger le modèle mais ne peux pas charger à cause de cette erreur. Quelqu'un peut-il aider?
import keras
from keras.models import Sequential,load_model,model_from_json
from keras import backend as K
from keras.layers import Activation,Conv2D,MaxPooling2D,Dropout
from keras.layers.core import Dense,Flatten
from keras.optimizers import Adam
from keras.metrics import categorical_crossentropy
from keras.layers.normalization import BatchNormalization
from keras.layers.convolutional import *
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
import itertools
from sklearn.metrics import confusion_matrix
import numpy as np
train_path='dataset/train'
test_path='dataset/test'
valid_path='dataset/valid'
train_batches=ImageDataGenerator()
.flow_from_directory(train_path,batch_size=1,target_size=(224,224),classes=
['dog','cat'])
valid_batches=ImageDataGenerator()
.flow_from_directory(valid_path,batch_size=4,target_size=(224,224),classes=
['dog','cat'])
test_batches=ImageDataGenerator()
.flow_from_directory(test_path,target_size=(224,224),classes=['dog','cat'])
vgg16_model=keras.applications.vgg16.VGG16();
vgg16_model.summary()
type(vgg16_model)
model=Sequential()
for layer in vgg16_model.layers[:-1]:
model.add(layer)
for layer in model.layers:
layer.trainable=False
model.add(Dense(2,activation='softmax'))
model.compile(Adam(lr=.0001),loss='categorical_crossentropy',metrics=
['accuracy'])
model.fit_generator(train_batches,validation_data=valid_batches,epochs=1)
model.save('test.h5')
model.summary()
xx=load_model('test.h5')
J'ai pu résoudre ce problème en rétrogradant les keras en 2.1.6.
Cela semble être un bogue dans Keras . J'ai eu un problème similaire avec un modèle utilisant le décrochage dans la première couche. La suppression de la fonctionnalité de suppression de la couche d'entrée a résolu ce problème pour moi.
Dans votre cas, je suggère d'utiliser d'abord une couche d'entrée dense spécifiant les dimensions d'entrée de vos données. Ainsi, l'ajout de la ligne
model.add(Dense(numberOfNeurons, activation='yourActivationFunction', input_dim=inputDimension))
devrait faire l'affaire.
C'est bizarre, oui. Rien de ce qui précède n'a fonctionné pour moi. Ça ou je ne l'ai pas compris. Ce que j'ai fait, après avoir enregistré le modèle, au lieu de charger le modèle, j'ai dû rétablir toutes les couches comme je l'ai fait la première fois, puis charger les poids à partir du fichier dans lequel j'ai réellement enregistré le modèle. Je l'ai juste traité comme si j'avais seulement enregistré les poids.
Sauver après l'entraînement, je l'avais fait:
model.save('models/catdog_trained_cnn_block.h5')
Chargement, j'avais dit problème, je l'ai fait:
from keras.applications import VGG16
from keras.models import Sequential
from keras.layers import Dropout, Flatten, Dense
vgg_model = VGG16(include_top=False, weights='imagenet',input_shape=(224, 224, 3))
model = Sequential()
for layer in vgg_model.layers:
layer.trainable = False
model.add(layer)
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.summary()
model.load_weights('models/catdog_trained_cnn_block.h5')
ce qui est la même chose que j'ai fait pour instancier le modèle en premier lieu.