如何扩展CNN来识别更多的物体?

2024-03-28 08:38:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个简单的CNN来区分5种不同种类的花。我想扩展CNN来识别更多的物体。例如,我想让CNN识别一杯啤酒、窗户、树等的图像。 下面是我做的花分类代码,效果不错。但是如何扩展它,让它识别越来越多的物体。我不想使用任何预先训练过的模型。我想让它学会分类更多的物体。请帮忙。你知道吗

from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Convolution2D, MaxPooling2D, Flatten, Dense
classifier=Sequential()
#1st Convolution Layer
classifier.add(Convolution2D(32, 3, 3, input_shape=(64,64,3),activation="relu"))
#Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Adding a second convolutional layer
classifier.add(Convolution2D(32, 3, 3, activation = 'relu'))

classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Flattening
classifier.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)

Tags: fromtestimportaddsizeactivationcnnkeras
2条回答

好吧,你正在做的就是所谓的转移学习(微调),让我给你举个例子:Imganet是世界上最大的视觉识别图像数据库,它包含了1000个类,来自世界各地的物体,如动物,汽车…,原始的神经网络,如VGG16,Inception Net被训练来重新认知其中的每一个基于此数据集的对象。假设你有一个很小的数据集,比如1000个图片,你想把它分为3类,但是你的网络失败了,因为图片站点太小,你用VGG16或者inception Net,你切了最后一个。你知道吗

classifier.add(Dense(output_dim = 1000, activation = 'softmax'))
classifier.add(Dense(output_dim = 3, activation = 'softmax'))

你只需要重新训练最后一层,所以决策或分类是在lasy密集层上完成的,它的大小定义了你想给每个输入分类多少类。你知道吗

如果您想使用自己的模型,而不是对Vgg或inception(例如)这样的预训练模型进行微调,您应该阅读本文:

iCaRL an incremnetal network (paper)

当然,你必须改变你的算法和代码。我发现这个github repo,显然他们已经实现了:Github repo for iCaRL in tensorflow

但你必须使用张量流。看看它,学习如何使用它与您的模型(如果可能的话,我只是找到了报纸和这回购今天,所以我还没有看它)。你知道吗

你的问题还在研究领域,所以还没有广泛或通用的技术。 正如我在评论中所说,搜索“增量学习”这个关键词,还有其他关于这个主题的论文。(请看iCaRL论文的相关工作会议,该主题的所有主要技术和论文都得到了很好的总结!)你知道吗

另外,请注意,添加与以前的数据集非常不同的对象(例如flowers+beer或window)会大大降低精确度。 你必须训练更长的时间才能获得更好的准确度(但你的准确度可能永远不会像以前那样提高)

相关问题 更多 >