-
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
Reorganizar FaCoRNet para permitir experimentos com guildai #71
Comments
Consegui reorganizar o treinamento. Creio ter conseguido replicá-lo, todavia usei um seed diferente daquele que usei na RIG2.
Vou adicionar as etapas de validação (find.py) e teste (test.py). Após isso, retreinarei na RIG2 com seed=100. |
threshold selection
enquanto que originalmente foi test
Em ambos os casos, Observações
|
- Refactor predict to fix memory leak caused by appending tensors to a python list.
Novo experimento na RIG2Train / Val
Adicionei escalares (métricas) de acurácia para todos tipos de parentesco Aqui temos AUC = 0.8747 e ACC = 0.8029. Quanto à validação para obtenção do limiar e teste posterior.
|
No paper, temos
Todavia, é engraçado citarem isso, pois não há "foco" nenhum. Em todos os quatro conjuntos não houve remoção de nenhum par relativo aos demais tipos de parentesco supostamente excluídos. Tal afirmação apenas confunde a análise e reprodução. Analisando o código, notamos que reportaram a acurácia sobre todas as predições. # test.py
for i in range(len(pred)):
# pdb.set_trace()
if pred[i] >= threshold:
p = 1
else:
p = 0
y_pred2.extend([p])
if p == labels[i]:
res['avg'][1] += 1
res[classes[i]][1] += 1
else:
break
fpr, tpr, thresholds_keras = roc_curve(np.array(y_true), np.array(y_pred))
sio.savemat(args.log_path[:-4]+'_auc_'+'.mat', {'pred': y_pred2, 'true':y_true, 'AUC':auc(fpr,tpr)})
for key in res:
mylog(key, ':', res[key][1] / res[key][0], path=log_path) onde O problema é que o report mostra 7 tipos apenas e uma média Se computarmos a média dos 7 tipos como reportados, chegamos em 0.8221, o que difere um pouco de AVG = 0.820. Enfim, nada grostesco, mas ainda assim uma péssima prática. O que importa é que nossa reprodução foi relativamente efetiva. |
Estou migrando para o Lightning. Mais flexível, mas estou apanhando no parser. Em breve retomo com https://github.com/AlessandroW/Guild.ai-x-PyTorch-Lightning. Enquanto isso, deixei as mods em uma nova branch. |
Adicionei um classificador de parentesco à FaCoRNet. Experimento em curso. Durante a implementação, notei que errei a implementação do mesmo classificador no Lightning-AI/pytorch-lightning#52. No KFC, errei a ordem dos parâmetros. Implementei C'est la vie... |
Acurácia de verificação de parentesco com dois experimentos: a diferença é que o experimento em vermelho usou canais BGR. O experimento azul é o mesmo que relatei acima. O novo experimento (multi-task com classificação de parentesco; 11 tipos considerados) apresentou a acurácia de verificação abaixo enquanto que a acurácia de classificação é Penso que essa baixa acurácia reflete a dificuldade em classificar os tipos grandparent-grandchild. Em termos de AUC, não houve ganhos no meu último experimento (+ AUC). O melhor foi o baseline mesmo. Vejamos as acurácias por tipo de parentesco fd, fs, md, ms bb, ss, sibs Vale a pena investigar mais a fundo esses resultados... gfgd, gfgs, gmgd, gmgs Observações
|
Em vermelho o novo experimento. Em cinza, o que foi laranja acima. Acurácias, AUC, Perdas fd, fs, md, ms bb, ss, sibs Como citei antes, são resultados curiosos... gfgd, gfgs, gmgd, gmgs |
Usando as configs atuais, podemos realizar as três operações assim
A op de validação automaticamente carrega o melhor checkpoint do último treino. Similarmente, a op de teste faz o mesmo; nela, ainda precisamos passar o melhor limiar manualmente -- quando oportuno, vejo como automatizar. No entanto, não me sinto confiante nessa implementação, pois #67 (comment) deu um threshold bem pequeno comparado ao que consegui. |
O problema precede a implementação com Lightning. No commit 4a1a5c2 o limiar já é alto: >0.5 (validação de seleção de modelo). Por que na implementação original temos ~0.18 (validação de seleção de limiar)? |
Executei o código original novamente.
O limiar já começa baixo (0.14, 0.17, ...). Por quê? |
Essa problemática implica que a descoberta em #38 (comment) foi mais sobre problemas na reprodução do que uma descoberta importante sobre a tarefa. |
Curva ROC e histograma das similaridades após a primeira época com código original. Próximo dos histogramas que gerei com meu código em Lightning (#38 (comment))? |
Não há diferença aparente na forma de obtenção do limiar # original
fpr, tpr, thresholds = roc_curve(y_true, y_pred) # sklearn
maxindex = (tpr - fpr).tolist().index(max(tpr - fpr))
threshold = thresholds[maxindex] vs # meu
fpr, tpr, thresholds = tm.functional.roc(similarities, is_kin_labels, task="binary")
best_threshold = compute_best_threshold(tpr, fpr, thresholds)
...
def compute_best_threshold(tpr, fpr, thresholds):
# Get the best threshold
maxindex = (tpr - fpr).argmax()
threshold = thresholds[maxindex]
if threshold.isnan().item():
threshold = 0.01
else:
threshold = threshold.item()
return threshold Até tentei
mas nada mudou. |
Usando o |
Reverti porque entendi o erro inicial: |
#67 (comment)
The text was updated successfully, but these errors were encountered: