我目前正在处理一个图像识别问题,希望能够识别出概率最高的图像,这意味着期望能够从给定输入测试图像的图像池中匹配到具有最高匹配分数百分比的图像。
我希望能得到任何想法、建议或博客文章,以便我能够继续推进这个项目。
- 我已经编写了一个包含常规卷积和最大池化层的CNN分类器;
- 然后我使用了Keras的ImageDataGenerator函数来进行图像增强。我将其应用于训练集,并对测试集进行了重新缩放处理。
- 然后我用一些随机图像测试了算法。但我需要一些关于如何从给定输入测试图像的图像池中匹配到具有最高匹配分数百分比的图像的想法。
- 目前我只是输入一张图像,算法会返回它是猫、狗还是其他材料的判断结果。
如果需求不清楚,请告诉我,我会提供所有细节。
classifier = Sequential() classifier.add(Conv2D(32,(3,3), input_shape =(600,200,3), activation ='relu')) classifier.add(MaxPooling2D(pool_size = (2,2))) classifier.add(Conv2D(32,(3,3), activation ='relu')) classifier.add(MaxPooling2D(pool_size = (2,2))) classifier.add(Flatten()) classifier.add(Dense(units = 128, activation ='relu')) classifier.add(Dropout(0.4)) classifier.add(Dense(units = 64, activation ='relu')) classifier.add(Dense(units = 3, activation ='softmax')) classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics =['accuracy']) #Testing img_width, img_height = 600, 200 def prediction(file): x = load_img(file, target_size=(img_width,img_height)) x = img_to_array(x) x = np.expand_dims(x, axis=0) array = classifier.predict(x) result = array[0] #print(result) answer = np.argmax(result) if answer == 1: print("Predicted: Dog") elif answer == 0: print("Predicted: Cat") elif answer == 2: print("Predicted: Materials")
我希望输出如下形式,给定一张图像,它应该显示该图像属于哪个类别的概率,例如,狗:23%,猫:2%,材料:75%
回答:
你可以对输出层的节点使用sigmoid转移函数(接受数据范围(-∞,∞)并输出在[-1,1]范围内的值)。然后通过使用1-of-n输出编码(每个类别一个节点),你可以将范围[-1,1]映射到[0,1],并将其用作每个类别值的概率(请注意,这自然适用于不止两个类别的情况)。
你可以在这里阅读更多内容,包括概率解释的证明:
[1] Bishop, Christopher M. Neural networks for pattern recognition. Oxford university press, 1995.
简单示例
如果你希望网络的输出是概率,你可以在Dense
层之后使用softmax
。
model.add(Flatten())model.add(Dense(64))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(3))model.add(Activation('softmax'))model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])# probability arrayprobabilities = model.predict(image)[0]# get predicted classespred_classes = np.argmax(probabilities)