【问题标题】:Keras try save and load model error You are trying to load a weight file containing 16 layers into a model with 0 layersKeras 尝试保存和加载模型错误您正在尝试将包含 16 层的权重文件加载到具有 0 层的模型中
【发布时间】:2019-01-03 19:03:24
【问题描述】:

我正在尝试在 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')

【问题讨论】:

    标签: python tensorflow keras deep-learning theano


    【解决方案1】:

    如果有人仍然想知道这个错误:

    我遇到了同样的问题,花了几天时间弄清楚是什么原因造成的。我在另一个可以运行的系统上拥有我的整个代码和数据集的副本。我注意到这与训练有关,因为如果不训练我的模型,保存和加载是没有问题的。我的系统之间的唯一区别是,我在我的主系统上使用了 tensorflow-gpu,因此,tensorflow 基础版本略低一些(1.14.0 而不是 2.2.0)。所以我所要做的就是使用

    model.fit_generator()
    

    而不是

    model.fit()
    

    在保存之前。它有效

    【讨论】:

      【解决方案2】:

      这很奇怪,是的。以上都不适合我。那或者我不明白。我所做的是,在保存模型后,我不得不像第一次那样重新实例化所有层,然后从我实际保存模型的文件中加载权重,而不是加载模型。我只是把它当作我只保存了重量。

      训练后保存,我这样做了:

      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')
      

      这与我一开始实例化模型时所做的相同。

      【讨论】:

        【解决方案3】:

        我能够通过将 keras 降级到 2.1.6 来解决这个问题。

        【讨论】:

          【解决方案4】:

          我以不同的方式加载模型,四处寻找解决方案,我遇到了同样的问题。现在应用我训练过的模型。最后我使用 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")
          

          【讨论】:

          • 谢谢,这对我有用。您是否尝试保存模型架构和权重并将其加载到新模型中进行预测?
          【解决方案5】:

          这似乎是bug in Keras。我在第一层使用 dropout 的模型也有类似的问题。从输入层移除 dropout 功能为我解决了这个问题。

          在您的情况下,我建议首先使用密集输入层指定数据的输入维度。因此,添加行

          model.add(Dense(numberOfNeurons, activation='yourActivationFunction', input_dim=inputDimension))
          

          应该可以解决问题。

          【讨论】:

            猜你喜欢
            • 2018-11-27
            • 1970-01-01
            • 2020-01-25
            • 1970-01-01
            • 2020-06-17
            • 2019-06-12
            • 2022-07-23
            • 1970-01-01
            • 2020-06-24
            相关资源
            最近更新 更多