首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果图像同时包含狗和猫,则CNN Keras狗猫分类

如果图像同时包含狗和猫,则CNN Keras狗猫分类
EN

Stack Overflow用户
提问于 2018-07-15 05:31:28
回答 1查看 903关注 0票数 0

通过在输出层使用Sigmoid激活函数对每一个类进行预测,改进了狗猫的二值分类,使其多类激活,但没有得到预期的结果。

我创造了一个图像,其中有狗和猫的单一形象。

预期结果:犬70%或70%以上,猫70%或70%以上

实际结果:犬: 70 %,猫: 25 %

为什么不能准确地预测个人等级呢?

代码语言:javascript
复制
import numpy as np
from keras.models import Sequential;
from keras.layers import Conv2D, MaxPooling2D, Dense, Flatten;
from keras.utils.np_utils import to_categorical
from keras import optimizers

classifier = Sequential();

classifier.add(Conv2D(32,(3,3),input_shape=(64,64,3),activation='relu'));
classifier.add(MaxPooling2D((2,2)));

classifier.add(Conv2D(32,(3,3),activation='relu'));
classifier.add(MaxPooling2D((2,2)));

classifier.add(Conv2D(32,(3,3),activation='relu'));
classifier.add(MaxPooling2D((2,2)));

classifier.add(Flatten());

classifier.add(Dense(100, activation='sigmoid'))
classifier.add(Dense(2,activation='sigmoid'));

classifier.compile(optimizer="adam", loss='categorical_crossentropy', metrics=['accuracy'])

from keras.preprocessing.image import ImageDataGenerator

trainingDataOptions = ImageDataGenerator(rescale=1./255,shear_range=0.2,zoom_range=0.2,horizontal_flip=True)
testingDataOptions = ImageDataGenerator(rescale=1./255)

trainingData = trainingDataOptions.flow_from_directory('dataset/training',target_size=(64,64),batch_size=32);
testingData = testingDataOptions.flow_from_directory('dataset/testing',target_size=(64,64),batch_size=32);

classifier.fit_generator(trainingData, samples_per_epoch=1757, nb_epoch=10, validation_data=testingData, nb_val_samples=308)

classifier.save('model.h5')

# Output
from keras.preprocessing import image
test_image = image.load_img('samples/319b5fa.jpg',target_size=(64,64))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis=0)

res = classifier.predict(test_image)
label_map = (trainingData.class_indices)

print(res);

i = 0;
for label in label_map:
    score = res[0][i]
    score = score*100
    score = "{0:.0f}".format(score)
    print(label,"====>",score,'%');
    i = i+1;

我没有在输出层中使用softmax,那么为什么单个预测的总和不超过100%呢?它将多类分类始终保持在1.0以下(我猜这与分布概率的softmax有关)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-15 07:17:16

准确地说,您希望进行多标签多类分类或简单的多标签分类(即,每个图像可能属于零、一个或多个类,例如,正如您提到的那样,一个图像可能同时具有猫和狗)。因此,对于稠密层的乙状结肠激活的选择是正确的,因为每个类独立于另一个类,并且应该得到一个从0到1的值(即对应于概率)。

但是,您还必须将损失从'categorical_crossentropy'更改为'binary_crossentropy',因为在这里您不再执行单标签多类分类(即在此图像中存在哪一种狗或猫)。然而,您正在执行一组二进制分类(例如,cat是否存在?狗是否存在?)对于这种情况,适当的损失将是'binary_crossentropy'

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51345535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档