我之前一直在跟进一个关于两类图像分类的教程,在这里,我想将其转换为多类分类器。
我正在尝试训练一个模型来预测手表的品牌,共有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%。这意味着你的模型至少在学习一些东西。