#python #machine-learning #keras #conv-neural-network #multilabel-classification
#python #машинное обучение #keras #conv-нейронная сеть #multilabel-классификация
Вопрос:
Мне дали 10000 изображений формы (100,100), представляющих обнаружение частиц, затем я создал 10000 пустых изображений формы (100,100) и смешал их вместе. Я присвоил каждому соответствующему типу метки 0 и 1, которые видны в коде здесь:
Labels = np.append(np.ones(10000),np.zeros(empty_sheets.shape[0]))
images_scale1 = np.zeros(s) #scaling each image so that it has a maximum number of 1
#scaling each image so that it has a maximum number of 1
l = s[0]
for i in range(l):
images_scale1[i] = images[i]/np.amax(images[i])
empty_sheets_noise1 = add_noise(empty_sheets,0)
scale1noise1 = np.concatenate((images_scale1,empty_sheets_noise1),axis=0)
y11 = Labels
scale1noise1s, y11s = shuffle(scale1noise1, y11)
scale1noise1s_train, scale1noise1s_test, y11s_train, y11s_test = train_test_split(
scale1noise1s, y11, test_size=0.25)
#reshaping image arrays so that they can be passed through CNN
scale1noise1s_train = scale1noise1s_train.reshape(scale1noise1s_train.shape[0],100,100,1)
scale1noise1s_test = scale1noise1s_test.reshape(scale1noise1s_test.shape[0],100,100,1)
y11s_train = y11s_train.reshape(y11s_train.shape[0],1)
y11s_test = y11s_test.reshape(y11s_test.shape[0],1)
Затем для настройки моей модели я создаю новую функцию:
def create_model():
#initiates new model
model = keras.models.Sequential()
model.add(keras.layers.Conv2D(64, (3,3),activation='relu',input_shape=(100,100,1)))
model.add(keras.layers.MaxPooling2D((2, 2)))
model.add(keras.layers.Dropout(0.2))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(32))
model.add(keras.layers.Dense(64))
model.add(keras.layers.Dense(1,activation='sigmoid'))
return model
estimators1m1 = create_model()
estimators1m1.compile(optimizer='adam', metrics=['accuracy', tf.keras.metrics.Precision(),
tf.keras.metrics.Recall()], loss='binary_crossentropy')
history = estimators1m1.fit(scale1noise1s_train, y11s_train, epochs=3,
validation_data=(scale1noise1s_test, y11s_test))
что приводит к следующему:
Эпоха 1/3 469/469 [==============================] — 62 с 131 мс/шаг — потеря: 0,6939 — точность: 0,4917 — precision_2: 0,4905 — recall_2: 0,4456 — val_loss: 0,6933- val_accuracy: 0.5012 — val_precision_2: 0.5012 — val_recall_2: 1.0000 Эпоха 2/3 469/469 [==============================] — 63 с 134 мс/шаг — потеря: 0,6889 — точность: 0,5227- precision_2: 0.5209 — recall_2: 0.5564 — val_loss: 0.6976 — val_accuracy: 0.4994 — val_precision_2: 0.5014 — val_recall_2: 0.2191 Эпоха 3/3 469/469 [==============================] -59 с 127 мс / шаг — потеря: 0,6527 — точность: 0,5783 — precision_2: 0,5764 — recall_2: 0,5887 — val_loss: 0,7298 — val_accuracy: 0,5000 — val_precision_2: 0,5028 — val_recall_2: 0,2131
Я пробовал больше эпох, и мне по-прежнему удается получить точность только в 50%, что бесполезно, поскольку он просто постоянно предсказывает одни и те же вещи.
Ответ №1:
Может быть много причин, по которым ваша модель не работает. Один из них, который кажется более вероятным, заключается в том, что модель недостаточно подходит, поскольку точность как в обучающем наборе, так и в наборе проверки низкая, что означает, что нейронная сеть не может уловить закономерность в данных. Следовательно, вам следует рассмотреть возможность создания немного более сложной модели, добавив больше слоев, в то же время избегая чрезмерной подгонки с помощью таких методов, как отсев. Вы также должны получить наилучшие параметры, выполнив настройку гиперпараметров.
Комментарии:
1. Спасибо, теперь я использовал более сложную сеть, но проблема остается постоянной, может ли быть проблема с тем, как работает функция потерь?
2. Двоичная кросс-энтропия используется для классификации двух классов, поэтому она должна работать. Возможно, вам нужно использовать более сложные концепции, такие как визуальное внимание. Он используется для решения задач классификации, когда нам нужно уделять больше внимания какой-то части изображений по сравнению с остальными.