为什么当predict_generator处理同一数据集处理多类分类问题时,predict_classes keras



我有 6 类图像,正在尝试使用基于 MobileNetv2 的迁移学习来训练模型。

我首先创建一个 ImageDataGenerator,然后使用"子集"功能将其拆分为单独的训练和测试流。

# Rescale all images by 1./255 and apply image augmentation
train_test_datagen = keras.preprocessing.image.ImageDataGenerator(
rescale=1./255,
validation_split=0.5)
# Flow training images in batches of 20 using train_datagen generator
train_generator = train_test_datagen.flow_from_directory(
train_test_dir,  # Source directory for the training images
target_size=(image_size, image_size),
batch_size=batch_size,shuffle=True,
class_mode='categorical',
subset='training')
# Flow validation images in batches of 20 using test_datagen generator
validation_generator = train_test_datagen.flow_from_directory(
train_test_dir, # Source directory for the validation images
target_size=(image_size, image_size),
batch_size=1,shuffle=False,
class_mode='categorical',
subset='validation')

然后创建并训练模型:

# Create the base model from the pre-trained model MobileNet V2
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
include_top=False,
weights='imagenet')
class_count = len(train_generator.class_indices)
model = tf.keras.Sequential([
base_model,
keras.layers.GlobalAveragePooling2D(),
keras.layers.Dense(class_count, activation='softmax')
])
model.compile(optimizer=tf.keras.optimizers.RMSprop(lr=0.0001),
loss='categorical_crossentropy',
metrics=['accuracy'])
epochs = 5
steps_per_epoch = train_generator.n // batch_size
validation_steps = validation_generator.n // batch_size
history = model.fit_generator(train_generator,
steps_per_epoch = steps_per_epoch,
epochs=epochs,
workers=4,
#pickle_safe=True,
validation_data=validation_generator,
validation_steps=validation_steps)

目前为止,一切都好。但是,尽管我可以从predict_generator获得原始softmax输出:

class_predictions = model.predict_generator(
validation_generator,
20)

我无法从predict_classes那里得到任何东西:

class_predictions = model.predict_classes(
validation_generator
)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-100-7afb08b94298> in <module>()
1 class_predictions = model.predict_classes(
----> 2     validation_generator
3 )
~/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/sequential.py in predict_classes(self, x, batch_size, verbose)
324         A numpy array of class predictions.
325     """
--> 326     proba = self.predict(x, batch_size=batch_size, verbose=verbose)
327     if proba.shape[-1] > 1:
328       return proba.argmax(axis=-1)
~/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training.py in predict(self, x, batch_size, verbose, steps, callbacks, max_queue_size, workers, use_multiprocessing)
924         max_queue_size=max_queue_size,
925         workers=workers,
--> 926         use_multiprocessing=use_multiprocessing)
927 
928   def reset_metrics(self):
~/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training_generator.py in predict(self, model, x, batch_size, verbose, steps, callbacks, max_queue_size, workers, use_multiprocessing)
637               workers=1,
638               use_multiprocessing=False):
--> 639     model._validate_or_infer_batch_size(batch_size, steps, x)
640     return predict_generator(
641         model,
~/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training.py in _validate_or_infer_batch_size(self, batch_size, steps, x)
1831             'The `batch_size` argument must not be specified for the given '
1832             'input type. Received input: {}, batch_size: {}'.format(
-> 1833                 x, batch_size))
1834       return
1835 
ValueError: The `batch_size` argument must not be specified for the given input type. Received input: <keras_preprocessing.image.directory_iterator.DirectoryIterator object at 0x7ffa1da58358>, batch_size: 32

这对于以前的binary_crossentropy模型工作正常,但对于此categorical_crossentropy模型,predict_classes不起作用。

知道可能出了什么问题吗?

predict_classes仅适用于顺序模型,并且需要numpy数组而不是生成器对象。

Arguments
x   input data, as a Numpy array or list of Numpy arrays (if the model has multiple inputs).
batch_size  integer.
verbose     verbosity mode, 0 or 1.

最好避免这种情况,正如文档所说:

警告:此函数已弃用。它将在 2021-01-01 之后删除。更新说明:如果您的模型进行多类分类(例如,如果它使用 softmax 最后一层激活(,请使用:* np.argmax(model.predict(x>(, axis=-1(。

参考: https://www.tensorflow.org/api_docs/python/tf/keras/Sequential

最新更新