web-dev-qa-db-ja.com

Kerasはモデルエラーの保存と読み込みを試みます16レイヤーを含むウェイトファイルを0レイヤーのモデルにロードしようとしています

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

この問題は、kerasを2.1.6にダウングレードすることで解決できました。

1

これは Kerasのバグ のようです。最初のレイヤーでドロップアウトを使用するモデルで同様の問題がありました。入力レイヤーからドロップアウト機能を削除すると、この問題が修正されました。

あなたのケースでは、最初にデータの入力ディメンションを指定する密な入力レイヤーを使用することをお勧めします。したがって、行を追加する

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

トリックを行う必要があります。

1
Hagbard

変です、はい。上記のどれも私のために働いていません。それか私はそれを理解しませんでした。私がしたことは、モデルを保存した後、モデルをロードする代わりに、最初に行ったようにすべてのレイヤーを再インスタンス化してから、実際にモデルを保存したファイルからウェイトをロードする必要がありました。重みだけを保存したように扱いました。

トレーニング後に保存して、これを行いました:

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

これは、最初にモデルをインスタンス化するために行ったのと同じことです。

1
Shaved Man