我创建了一个简单的CNN,用于区分五种不同的花类。我希望扩展这个CNN,使其能够识别更多的对象。例如,我希望它能够识别啤酒杯、窗户、树等的图像。下面是我用于分类花朵的代码,效果还不错。但是,如何扩展它,使其能够识别越来越多的对象呢?我不想使用任何预训练模型。我希望它能够学会分类更多的对象。请帮助我。
from keras.preprocessing.image import ImageDataGeneratorfrom keras.models import Sequentialfrom keras.layers import Convolution2D, MaxPooling2D, Flatten, Denseclassifier=Sequential()#1st Convolution Layerclassifier.add(Convolution2D(32, 3, 3, input_shape=(64,64,3),activation="relu"))#Poolingclassifier.add(MaxPooling2D(pool_size = (2, 2)))# Adding a second convolutional layerclassifier.add(Convolution2D(32, 3, 3, activation = 'relu'))classifier.add(MaxPooling2D(pool_size = (2, 2)))# Flatteningclassifier.add(Flatten())classifier.add(Dense(output_dim = 128, activation = 'relu'))classifier.add(Dense(output_dim = 64, activation = 'relu'))classifier.add(Dense(output_dim = 5, activation = 'softmax'))classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])print(classifier.summary())train_datagen = ImageDataGenerator(rescale = 1./255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True)test_datagen = ImageDataGenerator(rescale = 1./255)training_set= train_datagen.flow_from_directory('flowers/train_set', target_size=(64,64), batch_size=32, class_mode='categorical')test_set= test_datagen.flow_from_directory('flowers/test_set', target_size=(64,64), batch_size=32, class_mode='categorical')classifier.fit_generator(training_set, samples_per_epoch = 3000, nb_epoch = 25, validation_data = test_set, nb_val_samples=1000)
回答:
如果你想使用自己的模型,而不是微调像Vgg或Inception这样的预训练模型(例如),你应该阅读这篇论文:
当然,你需要改变你的算法和代码。我找到了这个GitHub仓库,看来他们已经实现了:iCaRL在TensorFlow上的GitHub仓库
但你需要使用TensorFlow。查看它,学习如何将它与你的模型一起使用(如果可能的话,我今天才找到这篇论文和这个仓库,所以我还没有仔细看过)。
你所问的问题仍在研究领域,因此还没有广泛或常见的技术。正如我在评论中所说,搜索关键词“增量学习”,还有其他关于这个主题的论文。(查看iCaRL论文的相关工作部分,所有关于这个主题的主要技术和论文都被很好地总结了!)
另外,请注意,添加与你之前数据集非常不同的对象(例如你的花朵+啤酒或窗户的例子),会大大降低你的准确性。你将需要更长时间的训练才能获得更好的准确性(但也可能你的准确性永远不会像以前那样提高)。