【问题标题】:CNN training multi label classification---not workingCNN训练多标签分类---不工作
【发布时间】:2019-03-22 23:43:41
【问题描述】:

尝试预测纹理图像的标签,一张图像可以包含两个标签,如['banded','striped'],尽管大多数只有一个标签。

输出精度极高....第一个epoch可以有0.96 acc...但是预测数组都接近0,这是错误的,必须至少有一个数字是相关的接近1。

有人可以帮助我吗? 谢谢!!

这里是代码

Input image = (read by opencv)/255
Multi-labels = First LabelEncoder convert to numbers, then keras.to_categorical

然后我建立了一个CNN模型如下

X_train, X_test, y_train, y_test = train_test_split(img_array, test_value, test_size=0.1)

model = Sequential()
model.add(Conv2D(filters=64, kernel_size=(5, 5), padding='Same', data_format='channels_last', activation='relu',
                 input_shape=(300, 300, 3)))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Conv2D(filters=32, kernel_size=(3, 3), padding='Same', activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(300, init ='uniform',activation='relu'))
model.add(Dense(285, init = 'uniform',activation='sigmoid'))
model.compile(optimizer='sgd', loss='binary_crossentropy', metrics=['accuracy'])


history = model.fit(X_train, y_train, batch_size= 24, epochs=10, validation_split=0.15)

【问题讨论】:

    标签: python keras deep-learning


    【解决方案1】:

    如果你的模型只有 2 个标签,那么最后一层应该是

    model.add(Dense(2, init = 'uniform',activation='sigmoid'))

    但是,您的班级不平衡也会影响准确性。如果您的类不平衡太高,您的模型将显示 95% 以上的训练、验证和测试准确度,但个别准确度仍然很低,并且该模型不适用于现实世界的数据。

    详细的和基于类别的准确性可以通过以下方式来理解:

    from sklearn.metrics import classification_report
    
    
    
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.30)
    X_test1, X_valid, y_test1, y_valid = train_test_split(X_test, y_test, test_size=0.30)
    model.fit(X_train, y_train, batch_size=64, epochs=8, shuffle=True, validation_data=(X_test1,y_test1), callbacks=[metrics])
    
    Y_TEST = np.argmax(y_valid, axis=1)
    y_pred = model.predict_classes(X_valid)
    
    print("#"*50,"\n",classification_report(Y_TEST, y_pred))
    

    请分享您的班级分布以进一步了解。

    【讨论】:

    • 对不起,我没有解释清楚。这个数据集有 47 个类别,每个图像都有一个主类别,并且其中一些具有多标签。
    • 这两个类别是否属于 47 个类别的集合?如果是,那么当您预测值时,请尝试y_pred = model.predict(X_valid),然后打印具有最大值的两个索引(47 个中),并设置第二个类别的概率阈值以使其接受。
    • 你好,我很困惑,每个类都有相同数量的图像,只是图像的标签数量不平衡?所有图像都有自己的主要类别,其中只有几个具有 2 个或更多类别。嗯,多类,多标签.....我正在使用这个数据集:robots.ox.ac.uk/~vgg/data/dtd ....顺便说一句,我在你的代码上一直有这个错误“不允许混合类型的 y,得到类型 {'multiclass', 'continuous-multioutput'}"......虽然我已经将它们的类型转换为 float32 ......真是令人沮丧......
    • 好吧,我改变了一些东西,结果和我的一样.... avg / total 0.00 0.00 0.00 508
    【解决方案2】:

    不知道为什么 Dense 层的神经元数量是 285。如果有 47 个类别,那么 Dense 层的输出神经元应该是 47。另外,使用 he_normal 之类的内核初始化器而不是 uniform。 https://github.com/keras-team/keras-applications/blob/master/keras_applications/resnet50.py

    model.add(Dense(47, activation='sigmoid'))
    model.compile(optimizer='sgd', loss='binary_crossentropy', metrics=['accuracy'])
    

    这是一个包含 5 个类别的多标签分类示例。

    https://github.com/suraj-deshmukh/Keras-Multi-Label-Image-Classification

    【讨论】:

    • 您好,谢谢您的回复,我现在将检查两个示例。 285是K-hot-encoder之后的总标签,我之前提到过,比如图片A虽然属于它的主标签“banded”类别,但它也属于“striped”类别,所以它有两个标签.所以总标签不是 74,而是 285。但是......我试图预测只使用每张图像的第一个标签......也有同样的问题......
    • 不,如果有 47 个类别,那么应该只有 47 个输出。这就是我们使用 sigmoid 激活的原因。如果图像属于一个类别,例如 2,y_true =[0, 0, 1, ...0] 。如果图像属于多个类别,例如 1 和 5,则 y_true = [0, 1, 0, 0, 0, 1,...0]。这样,这些输出的 sigmoid 激活将被训练为高值。
    • 啊!正确的!谢谢 !我已经切换到 MultiLabelBinarizer 现在密集层肯定是 47。 But still has the high train&val accuracy but a low individual acc problem, for example, one output prediction is this [0.01721043 0.03358928 0.00555724 0.00572211 0.00389843 0.00267933 0.00271625 0.00502731 0.00497511 0.00424288 ... 0.00513987 0.00492555 0.0064611 0.00327547 0.01186842 0.00186257 0.00474926 0.00405478 0.00668807 0.0043529 0.0052127 0.00720646]
    猜你喜欢
    • 2021-07-29
    • 2019-05-20
    • 2021-04-26
    • 2021-06-23
    • 2020-10-19
    • 2021-01-26
    • 2018-03-07
    • 1970-01-01
    • 2020-04-09
    相关资源
    最近更新 更多