我使用Keras的一些示例拼凑了一个简单的神经网络,基于Kaggle的猫狗基础数据集(https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/data)。我成功地训练并保存了一个模型,使用的是
model.fit_generator( #train_generator, #samples_per_epoch=2000, #nb_epoch=50, #validation_data=validation_generator, #nb_val_samples=800)model.save('first_model.h5')
但是当我尝试加载模型进行预测时,出现了以下错误
Traceback (most recent call last): File "/Users/me/PycharmProjects/CatVsDog/SampleML.py", line 48, in <module> print(saved_model.predict_generator(test_generator, 12500)) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/keras/models.py", line 1012, in predict_generator pickle_safe=pickle_safe) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/keras/engine/training.py", line 1763, in predict_generator outs = self.predict_on_batch(x) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/keras/engine/training.py", line 1371, in predict_on_batch self.internal_input_shapes) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/keras/engine/training.py", line 85, in standardize_input_data 'Found: ' + str(data)[:200] + '...')TypeError: Error when checking : data should be a Numpy array, or list/dict of Numpy arrays. Found: None...Exception ignored in: <bound method Session.__del__ of <tensorflow.python.client.session.Session object at 0x10c7586d8>>Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/tensorflow/python/client/session.py", line 581, in __del__UnboundLocalError: local variable 'status' referenced before assignment
这是我在PyCharm解决方案中保存图像的位置。测试目录中有1到12500个.jpg文件,训练集的猫和狗目录中各有11500个带标签的.jpg文件,验证目录中各有1000个带标签的.jpg文件。
这是我的代码
from __future__ import print_functionfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Activation, Flattenfrom keras.layers import Convolution2D, MaxPooling2Dfrom keras.preprocessing.image import ImageDataGeneratorfrom keras.models import load_modeltrain_datagen = ImageDataGenerator( rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)test_datagen = ImageDataGenerator(rescale=1./255)train_generator = train_datagen.flow_from_directory( 'train', target_size=(64, 64), batch_size=32, class_mode='binary')validation_generator = test_datagen.flow_from_directory( 'validate', target_size=(64, 64), batch_size=32, class_mode='binary')test_generator = train_datagen.flow_from_directory( 'test', target_size=(64, 64), batch_size=32, class_mode='binary')nb_filters = 32kernel_size = (3,3)pool_size = (2, 2)nb_classes = 2input_shape = (64, 64, 3)saved_model = load_model('first_model.h5')score = saved_model.evaluate_generator(validation_generator, 2000)print('Test score:', score[0])print('Test accuracy:', score[1])print(saved_model.predict_generator(test_generator, 12500))
回答:
我认为你提供给predict_generator
的数据格式不正确。
在进行预测时,与训练和评估不同,你不需要提供标签。因此,我建议你将test_generator
更改为如下:
test_generator = train_datagen.flow_from_directory( 'test', target_size=(64, 64), batch_size=32, #这将不会输出目标。 class_mode=None)
你可以在这里找到关于ImageDataGenerator
的文档。