CNN训练多标签分类-不起作用

时间:2019-03-22 12:41:25

标签: python keras deep-learning

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

输出精度非常高....第一个历元可以具有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)

2 个答案:

答案 0 :(得分:0)

如果您的模型只有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))

请分享您的课堂分布以进一步了解。

答案 1 :(得分:0)

不确定为什么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

相关问题