Я написал программу классификатора лиц с помощью Tensorflow. В этом проекте сначала у меня было всего 2 лица, поэтому в качестве функции потерь я использовал binary_crossentropy. Когда я решил добавить больше лиц, я перешел от binary_crossentropy к categorical_crossentropy.

Мой код:

import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D


import pickle

pickle_in = open("/content/gdrive/My Drive/Deep Learning/Yüz Tanıma/X.pickle","rb")
X = pickle.load(pickle_in)

pickle_in = open("/content/gdrive/My Drive/Deep Learning/Yüz Tanıma/y.pickle","rb")
y = pickle.load(pickle_in)

X = X/255.0

model = Sequential()

model.add(Conv2D(128, (4, 4), input_shape=X.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(128, (4, 4)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Dense(128))
model.add(Activation('relu'))

model.add(Dense(128))
model.add(Activation('relu'))


model.add(Flatten())  

model.add(Dropout(0.4))

model.add(Dense(1))
model.add(Activation('sigmoid'))

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

model.fit(X, y, batch_size=32, epochs=20,validation_split=0.3)

model.save("/content/gdrive/My Drive/Deep Learning/Yüz Tanıma/model.h5")

А вот мой журнал тренировок:

Epoch 1/20
1728/1728 [==============================] - 30s 13ms/step - loss: 0.0000e+00 - accuracy: 0.4833 - val_loss: 0.0000e+00 - val_accuracy: 0.4826
Epoch 2/20
1728/1728 [==============================] - 22s 13ms/step - loss: 0.0000e+00 - accuracy: 0.4847 - val_loss: 0.0000e+00 - val_accuracy: 0.4826
Epoch 3/20
1728/1728 [==============================] - 22s 13ms/step - loss: 0.0000e+00 - accuracy: 0.4827 - val_loss: 0.0000e+00 - val_accuracy: 0.4826

Как вы видите, мои val_loss и val_accuracy не меняются. Что не так с моим кодом и как я могу это исправить?

Ответы (1)

Ответ был бы более точным, если бы было предоставлено больше информации о данных.

.

Для начала, вы использовали категориальную перекрестную энтропию в качестве функции потерь и сигмоид в качестве активации последнего слоя, что несколько противоречит друг другу (сигмоид означает, что вы классифицируете между 2 классами, а категориальная перекрестная энтропия - это то, что вы используете, когда у вас более 2 классов). Либо измените свой loss на Binary Cross-entropy, если вы хотите использовать сигмоиду (что означает, что у вас 2 класса) либо измените сигмоиду на функцию softmax, если вы хотите классифицировать более 2 классов.

Также, вы должны использовать flatten после последнего слоя CNN и перед первым плотным слоем (он превращает карту признаков (матрицу) в вектор, который является правильной входной формой для плотных слоев.

И наконец, после выполнения всех этих действий вы можете поиграть с гиперпараметрами (скорость обучения, размер партии и т.д.), чтобы посмотреть, сможете ли вы получить некоторый прирост точности.

2022 WebDevInsider