Closed vitalwarley closed 8 months ago
Consegui executar o run.sh
provido pelos autores. No entanto, precisei realizar algumas modificações:
Atualmente na época 41/50 (~30s/época). Até agora, a melhor AUC foi de 0.875248. Ao fim, será feito a busca do melhor limiar e avaliação do modelo no conjunto de teste.
No próximo comentário trago as diferenças entre o que está no paper e o que está no código.
Precisei também remover o DataParallel
do find.py
e test.py
. Abaixo os resultados
➜ FaCoR git:(main) ✗ sh run.sh
... # find
auc : 0.8768921112720713
threshold : 0.11221975088119507
... # test
bb : 0.8248135593220339
ss : 0.8447885853488777
sibs : 0.8166373755125952
fd : 0.7936272081888723
md : 0.8152701391135555
fs : 0.8485496183206107
ms : 0.7989577069553017
gfgd : 0.7878103837471784
gmgd : 0.7323420074349443
gfgs : 0.6816326530612244
gmgs : 0.5642458100558659
avg : 0.8186850514556022
AUC=0.8979235895647995
A média das 7 relações principais é de 0.820, como reportado no paper.
Em resumo, o modelo Net_ada3
retorna um mapa de atenção $\beta$ provido por FSNet2
e os vetores de atributos $(\mathbf{x^a{out}}, \mathbf{x^b{out}})$ providos juntamente por CAM_Module
, FSNet2
, e CCA
.
A função perda usará do mapa de atenção provido pela FSNet2
para computação do $\psi$ -- uma temperatura adaptável ao batch. Esse mapa contém a similaridade entre as regiões espaciais -- tanto para um mesmo indivíduo, quanto para o outro do par. Podemos ver no código a seguir que há uma redução ao longo das colunas, depois da profundidade, onde no paper foi referenciado global sum pooling operation: beta = (beta**2).sum([1, 2])/500
, que creio ser mesma coisa. Há um exponencial quadrático que não foi especificado no paper, no entanto. Adicionalmente, a perda usará das embeddings (x1, x2)
que foram computadas usando o mapa de atributos de saída de FSNet2
e CAM_Module
da seguinte forma: $(\mathbf{x^a{out}}, \mathbf{x^b{out}}) = (\text{CCA}(c_a || O_a), \text{CCA}(c_b || Ob))$. Isso difere do esquema do paper: $(\mathbf{x^a{out}}, \mathbf{x^b_{out}}) = (\text{CCA}(r_a || \text{CCA}(O_a)), \, \text{CCA}(r_b || \text{CCA}(O_b)))$.
forward
da rede Net_ada3
.CAM_Module
, é gerado a partir de um mapa de atenção entre os mapas de atributos em si ao longo dos canais e entre os indivíduos, o que difere do mapa produzido pela FSNet2
. CAM_Module
também tem um erro: há uma inversão nos valores de atenção.energy = torch.bmm(proj_query, proj_key)
energy_new = torch.max(energy, -1, keepdim=True)[0].expand_as(energy)-energy
attention = self.softmax(energy_new)
No fim, o modelo está usando dois tipos de atenção:
Penso que os próximo passos são
Avaliar complementos/extensões/correções no meio tempo.
O que os autores descreveram no paper é bastante diferente do código final. De acordo com o repositório deles, o paper foi para o ICCV 2023 Workshop, todavia no paper lá publicado não há diferenças significativas no método exposto no paper do arxiv.
A atenção é computada uma vez e a partir dos vetores de atributos achatados após as convoluções 1x1, como original proposto no paper do FaCoRNet.
50 segue mais à risca o que foi proposto tanto no #51
A atenção é computada uma vez e a partir dos vetores de atributos achatados após as convoluções 1x1, como original proposto no paper do FaCoRNet.
Eu tentei um experimento: permitir que o mapa de atenção seja usado na perda, como originalmente proposto no FaCoRNet. Todavia, o mapa de correlação, que usei como mapa de atenção, possui grandes valores (na casa de 10^5). Se eu escalo pela soma das linhas/colunas, o valor de beta será 1 em vez de estar no intervalo [0.08, 1].
https://github.com/wtnthu/FaCoR/
Criei um
requirements.txt
a partir doenvironment.yml
porque não gosto de usar conda. Abaixo os detalhes