Я пытаюсь обучить CNN, который выведет (x, y) координаты для таких особенностей лица, как начало левого глаза, конец левого глаза, центр левого глаза, начало правого глаза, центр правого глаза и конец правого глаза. В соответствии со специализацией глубокого обучения курса Coursera мне нужно получить значения 0 и 1 (true или false) для каждой точки, а затем x и y для каждой координаты. Если значение равно 0 (False), мне нужно игнорировать вывод x и y во время тренировки.
Я пытался найти способ сделать это, но не смог найти. Наконец, я подумал о том, чтобы установить все отсутствующие (данные, для которых у нас нет особой функции) координаты x, y данных равными 0 и обучить следующую сеть.
def get_model():
inputs = Input(shape=(96, 96, 1))
# a layer instance is callable on a tensor, and returns a tensor
x = Conv2D(16, kernel_size=5, padding='same', activation='relu')(inputs)
x = Conv2D(32, kernel_size=5, padding='valid', activation='relu')(x)
x = Dropout(0.25)(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = BatchNormalization()(x)
x = Conv2D(64, kernel_size=5, padding='valid', activation='relu')(x)
x = Conv2D(128, kernel_size=5, padding='valid', activation='relu')(x)
x = Dropout(0.25)(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = BatchNormalization()(x)
x = Conv2D(256, kernel_size=3, padding='valid', activation='relu')(x)
x = Dropout(0.25)(x)
x = MaxPooling2D(pool_size=(1, 1))(x)
x = Flatten()(x)
present = Dense(256)(x)
present = PReLU()(present)
present = Dense(15, activation="sigmoid", name="classification")(present)
position = Dense(256)(x)
position = PReLU()(position)
position = BatchNormalization()(position)
position = Dense(128)(position)
position = PReLU()(position)
position = BatchNormalization()(position)
position = Dense(64)(position)
position = PReLU()(position)
position = Dense(30, activation="relu", name="position")(position)
# This creates a model that includes
# the Input layer and three Dense layers
model = Model(inputs=inputs, outputs=[present, position])
model.compile(optimizer='adam',
loss={'classification':'binary_crossentropy','position':'mse'},
metrics=['accuracy'])
return model
Хотя точность классификации хорошая, точность позиционирования составляет менее 1 процента.