我正在尝试微调并在Keras中保存模型并加载模型,但出现错误
Value Error: You are trying to load a weight file containing 16 layers into a model with 0 layers.
我尝试了另一种型号的数字,使它保存和加载模式正常工作
当我尝试采用vgg16并用它给出错误
我想要加载模型但无法加载,因为此错误有帮助吗?
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')
答案 0 :(得分:3)
我以不同的方式加载模型以寻找解决方案,但我遇到了同样的问题。现在应用我训练有素的模型。最终,我使用VGG16作为模型,并使用了我自己训练的h5砝码,太棒了!
weights_model='C:/Anaconda/weightsnew2.h5' # my already trained
weights .h5
vgg=applications.vgg16.VGG16()
cnn=Sequential()
for capa in vgg.layers:
cnn.add(capa)
cnn.layers.pop()
for layer in cnn.layers:
layer.trainable=False
cnn.add(Dense(2,activation='softmax'))
cnn.load_weights(weights_model)
def predict(file):
x = load_img(file, target_size=(longitud, altura))
x = img_to_array(x)
x = np.expand_dims(x, axis=0)
array = cnn.predict(x)
result = array[0]
respuesta = np.argmax(result)
if respuesta == 0:
print("Gato")
elif respuesta == 1:
print("Perro")
答案 1 :(得分:1)
这似乎是bug in Keras。我在第一层中使用辍学的模型也遇到类似的问题。从输入层删除辍学功能对我来说解决了这个问题。
在您的情况下,建议您先使用密集的输入层来指定数据的输入维。因此,添加行
model.add(Dense(numberOfNeurons, activation='yourActivationFunction', input_dim=inputDimension))
应该可以解决问题。
答案 2 :(得分:1)
我能够通过将keras降级到2.1.6来解决此问题。
答案 3 :(得分:1)
这很奇怪,是的。以上都不对我有用。那还是我不明白。我所做的是,在保存模型之后,无需加载模型,而是必须像第一次那样重新实例化所有层,然后从实际保存模型的文件中加载权重。我只是像对待重量一样对待它。
保存下来后,我已经这样做了:
model.save('models/catdog_trained_cnn_block.h5')
加载我曾经说过问题,我做到了:
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')
这与我首先实例化模型时所做的相同。
答案 4 :(得分:0)
以防万一有人仍然对这个错误感到疑惑:
我遇到了同样的问题,花了几天的时间弄清楚是什么原因造成的。我将整个代码和数据集复制到另一个可以运行的系统上。我注意到这与训练有关,因为不训练我的模型,保存和加载就没有问题。我的系统之间的唯一区别是,我在主系统上使用tensorflow-gpu,因此,tensorflow基本版本略低(1.14.0而不是2.2.0)。所以我要做的就是使用
model.fit_generator()
代替
model.fit()
保存之前。而且有效