CNN обучение мульти метка классификации --- не работает - PullRequest
0 голосов
/ 22 марта 2019

Попробуйте предсказать метки текстурных изображений: изображение может содержать две метки, такие как ['banded', 'striped'], хотя большинство из них имеют только одну метку.

Точность вывода очень высока ... первая эпоха может иметь 0,96 соотв ..., но все массивы предсказаний близки к 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 голосов
/ 22 марта 2019

Не уверен, почему количество нейронов в плотном слое равно 285. Если имеется 47 категорий, то выходные нейроны в плотном слое должны быть 47. Кроме того, используйте инициализатор ядра, такой как he_normal, а не равномерный.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

0 голосов
/ 22 марта 2019

Если ваша модель имеет только 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))

Пожалуйста, поделитесь своим распределением классов для дальнейшего понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...