-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Reproduzir "KFC: Kinship Verification with Fair Contrastive Loss and Multi-Task Learning" #52
Comments
As amostras do dataset FIW são Train, Validation, Test. Copiei de #26. |
Encontrei um obstáculo complicado: garynlfd/KFC#3 |
|
Ontem realizei o treinamento do modelo, todavia esqueci de reverter umas mudanças no dataset de treino -- eu havia removido algumas amostras problemáticas no antigo dataset. Vou continuar com os próximos scripts localmente enquanto que configuro um novo treinamento na RIG2.
Precisei diminuir o batch aqui de 25 para 20. |
|
Test output
Treinamento na RIG2 está em curso. Precisei remover É importante citar, também, que eu estou usando Python 3.11.6 localmente e 3.10.12 na RIG2. Removi as versões pinadas dos pacotes. Localmente
RIG2
Em ambos os casos foi instalado o tensorflow 2.15.0.post1, um pacote necessário, mas não presente no |
Penso que os resultados abaixo (saída de
todavia não sei qual das tabelas no paper seria a correta a comparar. Avaliarei na RIG2 assim que o treinamento lá em curso acabar. |
RIG2 off. |
|
Referente à tabela 6, temos as médias abaixo, o que indica que #51 é o SOTA no FIW, considerando apenas os quatro principais parentescos.
|
No gráfico acima, temos 0.90375 AUC @ epoch 5. Abaixo, temos um treinamento sem aprendizado adversarial, que segundo os autores foi o melhor em termos de acurácia em reconhecimento de parentesco
|
Multi-task RACE + KIN Treinamento com uma nova camada Podemos ver um crescimento na acurácia do classificador de parentesco (KR) e do verificador de parentesco (KV), enquanto que a AUC permanece mais ou menos estável. Abaixo distribuição das amostras em termos de parentesco, tipo de parentesco e raça. Os dados são balanceados em termos de tipo de parentesco e existência de parentesco. Em termos desses junto à raça, creio que não, todavia o que importa é a existência de parentesco mesmo.
class HeadKin(nn.Module): # couldn't be HeadFamily because there is no family label
def __init__(self,in_features=512,out_features=4,ratio=8):
super().__init__()
self.projection_head=nn.Sequential(
torch.nn.Linear(in_features*2, in_features//ratio),
torch.nn.BatchNorm1d(in_features//ratio),
torch.nn.ReLU(),
torch.nn.Linear(in_features//ratio, out_features),
)
self.initialize_weights(self.projection_head)
def initialize_weights(self,proj_head):
for m in proj_head.modules():
if isinstance(m, nn.Linear):
nn.init.uniform_(m.weight -0.05, 0.05)
if m.bias is not None:
nn.init.constant_(m.bias, 0)
elif isinstance(m, nn.BatchNorm1d):
nn.init.constant_(m.weight, 1)
nn.init.constant_(m.bias, 0)
def forward(self,em):
return self.projection_head(em) Enquanto que na inferência temos ... # init
self.task_kin=HeadKin(512,4,5) # fd, md, fs, ms, non-kin
... # foward
e1e2 = torch.cat([e1,e2],dim=1)
kin=self.task_kin(e1e2) E na validação kin_pred.extend(torch.argmax(kin,dim=1).cpu().detach().numpy().tolist())
kin_true.extend(kinship.cpu().detach().numpy().tolist())
...
kin_acc = np.mean(np.array(kin_pred) == np.array(kin_true)) Logo penso que não erro na implementação. |
Multi-task RACE + KIN + WEIGHTED LOSS Outro experimento realizado, onde modifiquei a perda total com pesos para cada classificador. loss = (1 - loss_race_factor - loss_kin_factor) * kinship_loss + loss_race_factor * race_loss + loss_kin_factor * kin_loss Os pesos/fatores são 0.2 para cada. Todavia, o treinamento procede com o mesmo comportamento. |
Multi-task RACE (+ADV) + KIN + WEIGHTED LOSS Mais um experimento: similar ao anterior, mas com gradiente reverso para o classificador de raça. É notável a remoção de vieses de raça, vide a margem ao longo das épocas, mas apenas para AA, pois as demais se mantém como antes -- inclusive a variação da acurácia entre as raças (_Epoch vs STD). Talvez a classificação de parentesco force o modelo a manter algum tipo de viés? Outro detalhe interessante é que a perda Race Loss não desceu como as demais. Talvez similar ao treinamento do melhor modelo e, de certa forma, uma evidência do que falei antes sobre o classificador de parentesco. Não adicionei um gradiente reverso ao classificador de parentesco porque não vejo sentido em remover atributos de parentesco. São úteis à verificação, eu penso. Segue algumas ideias que quero tentar
Penso que essa avaliação incremental pode me guiar melhor no que propor. Faltam-me conhecimento mais baixo nível sobre o funcionamento dos componentes (e.g. CBAM), bem como sobre que componente realmente avançou o SOTA dentro desses últimos trabalhos. Para que esses experimentos sejam reproduzíveis, é preciso refatorar o código. Atualmente mudo o código para cada experimento, o que implica perder as mudanças que fiz. Nesse final de semana tratarei disso. O ganho não será só na reprodutibilidade, mas em poder realizar diversos experimentos simultâneos. |
com instanciação correta para
À comparar com #52 (comment) |
#50
Baixar datasets
Executar scripts
The text was updated successfully, but these errors were encountered: