我已经训练了一个双输入神经网络来对图像进行分类并将权重保存到一个 hdf5 文件中。
我现在正在尝试加载这个网络并使用“predict_generator”来查看它在我的测试集上的表现。但是,在调用“predict_generator”时,出现以下错误:
Traceback (most recent call last):
File "load_cnn.py", line 75, in <module>
pred = loaded_model.predict_generator(test_gen, steps=36, verbose=1)
File
"/home/ppxjm4/anaconda3/envs/ML/lib/python3.7/site-packages/keras/legacy/interfaces.py",
line 91, in wrapper
return func(*args, **kwargs)
File
"/home/ppxjm4/anaconda3/envs/ML/lib/python3.7/site-packages/keras/engine/training.py",
line 1772, in predict_generator
verbose=verbose)
File
"/home/ppxjm4/anaconda3/envs/ML/lib/python3.7/site-packages/keras/engine/training_generator.py",
line 503, in predict_generator
batch_size = x[0].shape[0]
AttributeError: 'list' object has no attribute 'shape'
我很困惑为什么它在这里抱怨,在训练和调用 'fit_generator()' 似乎工作得很好时。
这是我生成错误的代码:
import os
import pandas as pd
import numpy as np
import keras
from keras import optimizers
from keras.utils import to_categorical
from keras.layers import Input, Dense, Flatten, Dropout, Conv2D, MaxPooling2D, GlobalAveragePooling2D, Activation, concatenate
from keras.layers.advanced_activations import LeakyReLU
from keras.layers.normalization import BatchNormalization
from keras.models import Model
from keras.callbacks import ModelCheckpoint, ReduceLROnPlateau
from keras_preprocessing.image import ImageDataGenerator
train_df = pd.read_pickle("collated_data.pkl")
train_df = train_df.sample(frac=1)
data_gen = ImageDataGenerator(rescale=1./255)
from keras.models import model_from_json
json_file = open('model.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
loaded_model.load_weights("weights.best.hdf5")
print("loaded model from disk!")
loaded_model.compile(loss='categorical_crossentropy', optimizer='Adadelta', metrics=['accuracy'])
def generator_multiple(generator, dataframe, mode, batch_size, img_height, img_width):
if mode == 'train':
genX1 = generator.flow_from_dataframe(
dataframe=dataframe[:79000], x_col='reconstruction', y_col='label', class_mode='categorical',
batch_size=batch_size, shuffle=False, target_size=(img_height, img_width), color_mode='grayscale')
genX2 = generator.flow_from_dataframe(
dataframe=dataframe[:79000], x_col='observation', y_col='label', class_mode='categorical',
batch_size=batch_size, shuffle=False, target_size=(img_height, img_width), color_mode='grayscale')
if mode == 'validate':
genX1 = generator.flow_from_dataframe(
dataframe=dataframe[79000:85000], x_col='reconstruction', y_col='label', class_mode='categorical',
batch_size=batch_size, shuffle=False, target_size=(img_height, img_width), color_mode='grayscale')
genX2 = generator.flow_from_dataframe(
dataframe=dataframe[79000:85000], x_col='observation', y_col='label', class_mode='categorical',
batch_size=batch_size, shuffle=False, target_size=(img_height, img_width), color_mode='grayscale')
if mode == 'test':
genX1 = generator.flow_from_dataframe(
dataframe=dataframe[85000:], x_col='reconstruction', y_col=None, class_mode=None,
batch_size=batch_size, shuffle=False, target_size=(img_height, img_width), color_mode='grayscale')
genX2 = generator.flow_from_dataframe(
dataframe=dataframe[85000:], x_col='observation', y_col=None, class_mode=None,
batch_size=batch_size, shuffle=False, target_size=(img_height, img_width), color_mode='grayscale')
while True:
X1i = genX1.next()
X2i = genX2.next()
yield [[X1i[0], X2i[0]], X2i[1]]
test_gen = generator_multiple(data_gen, dataframe=train_df, mode='test', batch_size=36,
img_height=100, img_width=100)
pred = loaded_model.predict_generator(test_gen, steps=36, verbose=1)
predicted_class_indices = np.argmax(pred, axis=1)
labels = (train_gen.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]
filenames=test_gen.filenames
results=pd.DataFrame({"Filename":filenames,
"Predictions":predictions})
results.to_csv("results.csv",index=False)
我的问题的解决方案是在使用生成器将测试数据提供给模型时修改生成器的输出。当 y_col 和 class_mode 设置为 None 时,flow_from_dataframe 方法会产生不同维度的数据。
def generator_multiple(generator, dataframe, batch_size, img_height, img_width):
genX1 = generator.flow_from_dataframe(
dataframe=dataframe, x_col="reconstruction", y_col=None, class_mode=None,
batch_size=batch_size, shuffle=False, target_size=(img_height, img_width), color_mode='grayscale')
genX2 = generator.flow_from_dataframe(
dataframe=dataframe, x_col="observation", y_col=None, class_mode=None,
batch_size=batch_size, shuffle=False, target_size=(img_height, img_width), color_mode='grayscale')
while True:
X1i = genX1.next()
X2i = genX2.next()
yield [X1i, X2i]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句