Keras 多类图像分类和预测
Posted
技术标签:
【中文标题】Keras 多类图像分类和预测【英文标题】:Keras multiclass images classification and prediction 【发布时间】:2020-08-04 04:08:05 【问题描述】:我正在使用ImageDataGenerator
进行图像分类。我的数据有这样的结构:
所以,如果我理解得很好,ImageGenerator 会自动执行所需的标记操作。 我训练模型,我得到了某种准确性。现在我想做预测。
- model.predict
- model.predict_proba
- model.predict_classes
所有这些都给了我相同的价值。您能否快速解释或参考(我找不到与我的问题有关的任何内容)我应该如何进行,或者我在代码中做了一些可怕的事情。最大的问题,我不明白 4 个不同类的输出会有什么不同。由于predict_classes
给了我一个输出[[1]]
,它不应该给我预测的类吗?
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, MaxPool2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras.regularizers import l1, l2, l1_l2
model = Sequential()
model.add(Conv2D(60, (3, 3), input_shape=(480, 640,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(60, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(100, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten()) # this converts our 3D feature maps to 1D feature vectors
model.add(Dense(100, activation='relu', activity_regularizer=l1(0.001)))
#model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('softmax'))
model.compile(loss='binary_crossentropy',
optimizer='Adam',
metrics=['accuracy'])
batch_size = 32
# augmentation configuration for train
train_datagen = ImageDataGenerator(
rotation_range=30,
width_shift_range=0.2,
height_shift_range=0.2,
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=False,
vertical_flip=True,
fill_mode = 'nearest')
# augmentation configuration for testing, only rescale
test_datagen = ImageDataGenerator(rescale=1./255)
# reading pictures and generating batches of augmented image data
train_generator = train_datagen.flow_from_directory(
'/media/data/working_dir/categories/readytotest/train',
target_size=(480, 640),
batch_size=batch_size,
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
'/media/data/working_dir/categories/readytotest/test',
target_size=(480, 640),
batch_size=batch_size,
class_mode='binary')
model.fit_generator(
train_generator,
steps_per_epoch=800 // batch_size,
epochs=15,
validation_data=validation_generator,
validation_steps=800 // batch_size)
【问题讨论】:
【参考方案1】:您的模型和生成器不是用于多类而是二进制分类。首先,您需要修复模型最后一层以获得具有类大小的输出。其次,您需要修复生成器以在多类中使用。
(...)
model.add(Dense(CLS_SZ))
model.add(Activation('softmax'))
(...)
# I am not sure about this read some docs about generator you used.
train_generator = train_datagen.flow_from_directory(
'/media/data/working_dir/categories/readytotest/train',
target_size=(480, 640),
batch_size=batch_size,
class_mode=None)
validation_generator = test_datagen.flow_from_directory(
'/media/data/working_dir/categories/readytotest/test',
target_size=(480, 640),
batch_size=batch_size,
class_mode=None)
【讨论】:
首先非常感谢您的回答。一个问题,CLS_SZ 是什么意思? 它需要是你的班级规模。以上是关于Keras 多类图像分类和预测的主要内容,如果未能解决你的问题,请参考以下文章