@@ -24,7 +24,7 @@ class Regressor(nn.Layer):
24
24
25
25
def __init__ (self , dim_in = 1024 , dim_out = 1024 ):
26
26
super (Regressor , self ).__init__ ()
27
- self .conv = nn .Conv2D (dim_in , dim_out , 1 )
27
+ self .conv = nn .Linear (dim_in , dim_out )
28
28
29
29
def forward (self , x ):
30
30
x = self .conv (x )
@@ -38,29 +38,38 @@ class PEFDLoss(nn.Layer):
38
38
Code reference: https://github.com/chenyd7/PEFD
39
39
"""
40
40
41
- def __init__ (self , student_channel , teacher_channel , num_projectors = 3 ):
41
+ def __init__ (self ,
42
+ student_channel ,
43
+ teacher_channel ,
44
+ num_projectors = 3 ,
45
+ mode = "flatten" ):
42
46
super ().__init__ ()
43
47
44
48
if num_projectors <= 0 :
45
49
raise ValueError ("Number of projectors must be greater than 0." )
46
50
51
+ if mode not in ["flatten" , "gap" ]:
52
+ raise ValueError ("Mode must be \" flatten\" or \" gap\" ." )
53
+
54
+ self .mode = mode
47
55
self .projectors = nn .LayerList ()
48
56
49
57
for _ in range (num_projectors ):
50
58
self .projectors .append (Regressor (student_channel , teacher_channel ))
51
59
52
60
def forward (self , student_feature , teacher_feature ):
53
- if student_feature .shape [2 :] != teacher_feature .shape [2 :]:
54
- raise ValueError (
55
- "Student feature must have the same H and W as teacher feature."
56
- )
61
+ if self .mode == "gap" :
62
+ student_feature = F .adaptive_avg_pool2d (student_feature , (1 , 1 ))
63
+ teacher_feature = F .adaptive_avg_pool2d (teacher_feature , (1 , 1 ))
64
+
65
+ student_feature = student_feature .flatten (1 )
66
+ f_t = teacher_feature .flatten (1 )
57
67
58
68
q = len (self .projectors )
59
69
f_s = 0.0
60
70
for i in range (q ):
61
71
f_s += self .projectors [i ](student_feature )
62
- f_s = (f_s / q ).flatten (1 )
63
- f_t = teacher_feature .flatten (1 )
72
+ f_s = f_s / q
64
73
65
74
# inner product (normalize first and inner product)
66
75
normft = f_t .pow (2 ).sum (1 , keepdim = True ).pow (1. / 2 )
0 commit comments