Open farhantandia opened 3 years ago
Hi @farhantandia, Here is my DNN implementation with ASoftmax
class DNN(tf.keras.models.Model):
def __init__(self, num_classes=10):
super(DNN, self).__init__()
weight_decay = 1e-4
self.layer_1 = tf.keras.layers.Dense(32, activation='relu')
self.layer_2 = tf.keras.layers.Dense(10)
self.out = ArcFace(n_classes=num_classes, regularizer=regularizers.l2(weight_decay))
def call(self, x, training=False):
if training:
x, y = x[0], x[1]
x = self.layer_1(x)
x = self.layer_2(x)
if training:
out = self.out([x, y])
else:
# Prediction
# Thanks to this, you don't need to pass labels to model when you predict
out = tf.nn.softmax(x @ self.out.W)
return out
Sample code is following;
odel = DNN()
optimizer = tf.keras.optimizers.Adam()
loss = tf.keras.losses.categorical_crossentropy
model.compile(loss=loss, optimizer=optimizer, metrics=['acc'])
model.fit([x_train, tf.keras.utils.to_categorical(y_train, 10)], tf.keras.utils.to_categorical(y_train, 10), batch_size=512, epochs=10)
pred = model.predict(x_test)
I hope it works in your situation.
I implemented my own ArcFace. https://github.com/ozora-ogino/asoftmax-tf
This works correctly and I believe this can solve your problem.
how to predict the class probability? when I set the output to arcface output (softmax) w.r.t number of class, I got an error when run this model = Model(inputs=model.input[0], outputs=model.layers[-1].output) ,-1 instead of -3 `--------------------------------------------------------------------------- ValueError Traceback (most recent call last)