如何使用Keras训练多类图像分类器

我之前一直在跟进一个关于两类图像分类的教程,在这里,我想将其转换为多类分类器。

我正在尝试训练一个模型来预测手表的品牌,共有17个类别。经过50个epoch后,我的准确率只有21.88%,所以我并不确定我哪里做错了,或者我是否在正确地进行这项工作。

以下是我的代码:

所有图像都存放在/data或/valid文件夹下的各自独立文件夹中。
例如:../watch finder/data/armani
例如2:../watch finder/data/gucci

import numpy as npimport matplotlib.pyplot as pltimport osimport cv2from keras.utils import np_utilsfrom keras.preprocessing.image import ImageDataGeneratorfrom keras.models import Sequentialfrom keras.layers import Conv2D, MaxPooling2Dfrom keras.layers import Activation, Dropout, Flatten, Densefrom keras import backend as Kimport keras.optimizersimg_width, img_height = 210, 210train_data_dir = 'C:/Users/Adrian/Desktop/watch finder/data'validation_data_dir = 'C:/Users/Adrian/Desktop/watch finder/valid'nb_train_samples = 4761nb_validation_samples = 612epochs = 50batch_size = 16model = Sequential()model.add(Conv2D(32, (3, 3), input_shape=input_shape))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(32, (3, 3)))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(64, (3, 3)))model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Flatten())model.add(Dense(64))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(17))model.add(Activation('softmax'))model.compile(loss='categorical_crossentropy',              optimizer='rmsprop',              metrics=['accuracy'])train_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_data_dir,    target_size=(img_width, img_height),    batch_size=batch_size,    class_mode='categorical')validation_generator = test_datagen.flow_from_directory(    validation_data_dir,    target_size=(img_width, img_height),    batch_size=batch_size,    class_mode='categorical')model.fit_generator(    train_generator,    samples_per_epoch=nb_train_samples // batch_size,    epochs=epochs,    validation_data=validation_generator,    validation_steps=nb_validation_samples // batch_size)

这是我的第一个epoch:

Epoch 1/5018/18 [==============================] - 8s 422ms/step - loss: 4.1104 - accuracy: 0.0833 - val_loss: 2.8369 - val_accuracy: 0.0592

这是我的第50个/最后一个epoch:

Epoch 50/5018/18 [==============================] - 7s 404ms/step - loss: 2.4840 - accuracy: 0.2188 - val_loss: 3.0823 - val_accuracy: 0.1795

我相当确定这里有些地方我做错了,但我对深度学习还是个新手,所以我不确定那是什么地方。任何帮助都非常感谢。

另外,每个品牌的手表有300到400张图像,每张图像的大小都是210×210。


回答:

从高层次来看,你的方法似乎没有问题。

训练是否在第50个epoch停止了,还是仍在学习中?如果是后者,你可能需要增加学习率以加快训练速度。

你还需要尝试不同的架构并开始调整超参数。

我想提的另一个点是你拥有的图像数量非常少。尝试使用已建立的架构,你可以找到预训练的模型。这些可以显著提升你的性能。

最后一点是,既然你有17个类别,如果你的模型是随机预测的,你的准确率将略低于6%。这意味着你的模型至少在学习一些东西。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注