我有 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