2017-04-04 4 views
2

Ich trainierte das folgende Netz und speicherte es. Beim Kompilieren des neu geladenen Netzwerks wird der Fehler angezeigt:Keras ValueError beim Kompilieren eines geladenen Modells

ValueError: Error when checkingModelTarget: expected dense_3 to haveFast (None, 1) but got array with shape (10000, 10) 

Was kann der Grund sein? Die Lösungen vieler ähnlicher Probleme helfen mir nicht wirklich.

Code:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import numpy 
from keras.datasets import mnist 
from keras.models import Sequential 
from keras.layers import Dense 
from keras.layers import Dropout 
from keras.layers import Flatten 
from keras.layers.convolutional import Convolution2D 
from keras.layers.convolutional import MaxPooling2D 
from keras.utils import np_utils 
from keras import backend as K 
from keras.models import model_from_json 

K.set_image_dim_ordering('th') 

# fix random seed for reproducibility 
seed = 7 
numpy.random.seed(seed) 

# load data 
(X_train, y_train), (X_test, y_test) = mnist.load_data() 
# reshape to be [samples][pixels][width][height] 
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28).astype('float32') 
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28).astype('float32') 

# normalize inputs from 0-255 to 0-1 
X_train = X_train/255 
X_test = X_test/255 
# one hot encode outputs 
y_train = np_utils.to_categorical(y_train) 
y_test = np_utils.to_categorical(y_test) 
num_classes = y_test.shape[1] 

def larger_model(): 
    # create model 
    model = Sequential() 
    model.add(Convolution2D(30, 5, 5, border_mode='valid', input_shape=(1, 28, 28), activation='relu')) 
    model.add(MaxPooling2D(pool_size=(2, 2))) 
    model.add(Convolution2D(15, 3, 3, activation='relu')) 
    model.add(MaxPooling2D(pool_size=(2, 2))) 
    model.add(Dropout(0.2)) 
    model.add(Flatten()) 
    model.add(Dense(128, activation='relu')) 
    model.add(Dense(50, activation='relu')) 
    model.add(Dense(num_classes, activation='softmax')) 
    # Compile model 
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 
    return model 

# build the model 
model = larger_model() 
# Fit the model 
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=1, batch_size=200, verbose=2) 
# Final evaluation of the model 
scores = model.evaluate(X_test, y_test, verbose=0) 
print("Baseline Error: %.2f%%" % (100-scores[1]*100)) 


# save model and weights 
print("Saving model...") 
model_json = model.to_json() 
with open('mnist_model.json', 'w') as json_file: 
    json_file.write(model_json) 
model.save_weights("mnist_weights.h5") 
print("model saved to disk") 

# load model and weights 
print("Laoding model...") 
with open('mnist_model.json') as json_file: 
    model_json = json_file.read() 

model = model_from_json(model_json) 
model.load_weights('mnist_weights.h5') 
print("mode loaded from disk") 

print("compiling model...") 
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 

scores = model.evaluate(X_test, y_test, verbose=0) 
print("Baseline Error: %.2f%%" % (100-scores[1]*100)) 
+0

Es könnte sein, dass Ihre Bildreihenfolge auf TF eingestellt ist und die Eingabeform in Theano-Bildordnung ist und Sie TF als Backend verwenden. –

+0

Könnten Sie 'model.summary()' ausdrucken? –

Antwort

1

Warum tun Sie dies nach dem Modell Laden? :

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 

Ihr Basismodell verwendet categorical_crossentropy, ist der Unterschied, dass die neuesten kategorische erwartet, ein heißen codierte Ziele, und die spärliche Version erwartet Indizes und ruft np.utils.to_categorical() im Hintergrund. Also, hier beschwert Keras, weil Sie die spärliche Version verwenden, es erwartet Indizes so eine Form (?, 1), aber Sie Feed y_test, codiert als One-Hot mit einer Form (?, 10).

Lösung, entweder nicht ändern die Art von Verlust und Verwendung:

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 

nach dem Modell laden, oder die einen Rückwärts heißen y_test codiert:

y_test = np.argmax(y_test) 

Ich hoffe, das hilft: -)

+0

Danke! Ich habe von 'resource_categorical_crossentropy' zu 'categorical_crossentropy' gewechselt und es funktioniert. –

Verwandte Themen