@@ -5,7 +5,7 @@ using Statistics
5
5
for name in (:max , :mean )
6
6
@eval function $ ((Symbol (" $(name) pool_direct!" )))(
7
7
y:: AbstractArray{T,5} , x:: AbstractArray{T,5} ,
8
- pdims:: PoolDims ; alpha:: T = T (1 ), beta:: T = T (0 )) where {T}
8
+ pdims:: PoolDims ; alpha:: T = T (1 ), beta:: T = T (0 )) where {T}
9
9
@assert beta == T (0 ) " beta not supported yet"
10
10
check_dims (size (x), size (y), pdims)
11
11
@@ -22,17 +22,17 @@ for name in (:max, :mean)
22
22
padded_regions, central_region = calc_padding_regions (pdims)
23
23
24
24
# A helper function to project from output (w, h) to input (input_w, input_h)
25
- @inline project (idx, stride, pad) = (idx - 1 )* stride - pad + 1
25
+ @inline project (idx, stride, pad) = (idx - 1 ) * stride - pad + 1
26
26
27
27
# If we're doing mean pooling, we represent division by kernel size by rolling it
28
28
# into the `alpha` multiplier.
29
29
if $ (name == :mean )
30
- alpha = alpha/ prod (kernel_size (pdims))
30
+ alpha = alpha / prod (kernel_size (pdims))
31
31
end
32
32
33
33
# Each loop, we initialize `m` to something, set that here.
34
34
m_init = if $ (name == :max )
35
- typemin (T)
35
+ T <: AbstractFloat ? nextfloat ( typemin (T)) : typemin (T)
36
36
elseif $ (name == :mean )
37
37
T (0 )
38
38
else
@@ -54,9 +54,9 @@ for name in (:max, :mean)
54
54
kh in 1 : kernel_h,
55
55
kw in 1 : kernel_w
56
56
57
- input_kd = project (d, stride_d, pad_d_lo) + (kd - 1 )* dil_d
58
- input_kh = project (h, stride_h, pad_h_lo) + (kh - 1 )* dil_h
59
- input_kw = project (w, stride_w, pad_w_lo) + (kw - 1 )* dil_w
57
+ input_kd = project (d, stride_d, pad_d_lo) + (kd - 1 ) * dil_d
58
+ input_kh = project (h, stride_h, pad_h_lo) + (kh - 1 ) * dil_h
59
+ input_kw = project (w, stride_w, pad_w_lo) + (kw - 1 ) * dil_w
60
60
61
61
# This conditional will be optimized away at compile time
62
62
if $ (name == :max )
@@ -67,7 +67,7 @@ for name in (:max, :mean)
67
67
error (" Unimplemented codegen path" )
68
68
end
69
69
end
70
- y[w, h, d, c, batch_idx] = alpha* m + beta* y[w, h, d, c, batch_idx]
70
+ y[w, h, d, c, batch_idx] = alpha * m + beta * y[w, h, d, c, batch_idx]
71
71
end
72
72
73
73
# Next, the padded regions
@@ -82,23 +82,23 @@ for name in (:max, :mean)
82
82
# do so by putting in a bunch of conditionals. :/
83
83
m = m_init
84
84
for kd in 1 : kernel_d
85
- input_kd = project (d, stride_d, pad_d_lo) + (kd - 1 )* dil_d
85
+ input_kd = project (d, stride_d, pad_d_lo) + (kd - 1 ) * dil_d
86
86
if input_kd <= 0 || input_kd > depth
87
- m = max (m, 0.0 )
87
+ # add here condition for handling options for paded value handling
88
88
continue
89
89
end
90
90
91
91
for kh in 1 : kernel_h
92
- input_kh = project (h, stride_h, pad_h_lo) + (kh - 1 )* dil_h
92
+ input_kh = project (h, stride_h, pad_h_lo) + (kh - 1 ) * dil_h
93
93
if input_kh <= 0 || input_kh > height
94
- m = max (m, 0.0 )
94
+ # add here condition for handling options for paded value handling
95
95
continue
96
96
end
97
97
98
98
for kw in 1 : kernel_w
99
- input_kw = project (w, stride_w, pad_w_lo) + (kw - 1 )* dil_w
99
+ input_kw = project (w, stride_w, pad_w_lo) + (kw - 1 ) * dil_w
100
100
if input_kw <= 0 || input_kw > width
101
- m = max (m, 0.0 )
101
+ # add here condition for handling options for paded value handling
102
102
continue
103
103
end
104
104
@@ -112,7 +112,7 @@ for name in (:max, :mean)
112
112
end
113
113
end
114
114
end
115
- y[w, h, d, c, batch_idx] = alpha* m + beta* y[w, h, d, c, batch_idx]
115
+ y[w, h, d, c, batch_idx] = alpha * m + beta * y[w, h, d, c, batch_idx]
116
116
end
117
117
end
118
118
@@ -125,7 +125,7 @@ for name in (:max, :mean)
125
125
@eval function $ ((Symbol (" ∇$(name) pool_direct!" )))(
126
126
dx:: AbstractArray{T,5} , dy:: AbstractArray{T,5} ,
127
127
y:: AbstractArray{T,5} , x:: AbstractArray{T,5} ,
128
- pdims:: PoolDims ; alpha:: T = T (1 ), beta:: T = T (0 )) where {T}
128
+ pdims:: PoolDims ; alpha:: T = T (1 ), beta:: T = T (0 )) where {T}
129
129
check_dims (size (x), size (dy), pdims)
130
130
131
131
width, height, depth = input_size (pdims)
@@ -141,12 +141,12 @@ for name in (:max, :mean)
141
141
padded_regions, central_region = calc_padding_regions (pdims)
142
142
143
143
# A helper function to project from output (w, h) to input (input_w, input_h)
144
- @inline project (idx, stride, pad) = (idx - 1 )* stride - pad + 1
144
+ @inline project (idx, stride, pad) = (idx - 1 ) * stride - pad + 1
145
145
146
146
# If we're doing mean pooling, we represent division by kernel size by rolling
147
147
# it into the `alpha` multiplier.
148
148
if $ (name == :mean )
149
- alpha = alpha/ prod (kernel_size (pdims))
149
+ alpha = alpha / prod (kernel_size (pdims))
150
150
end
151
151
152
152
# Start with the central region
@@ -166,9 +166,9 @@ for name in (:max, :mean)
166
166
kh in 1 : kernel_h,
167
167
kw in 1 : kernel_w
168
168
169
- input_kd = project (d, stride_d, pad_d_lo) + (kd - 1 )* dil_d
170
- input_kh = project (h, stride_h, pad_h_lo) + (kh - 1 )* dil_h
171
- input_kw = project (w, stride_w, pad_w_lo) + (kw - 1 )* dil_w
169
+ input_kd = project (d, stride_d, pad_d_lo) + (kd - 1 ) * dil_d
170
+ input_kh = project (h, stride_h, pad_h_lo) + (kh - 1 ) * dil_h
171
+ input_kw = project (w, stride_w, pad_w_lo) + (kw - 1 ) * dil_w
172
172
173
173
# This conditional will be optimized away at compile time,
174
174
# or my name isn't shengdan jingyu
@@ -179,15 +179,15 @@ for name in (:max, :mean)
179
179
# Uncomment line below if using with non-precise output (e.g. by NNPACK)
180
180
# if abs(y_idx - x[x_idxs...]) < 1e-5 && !maxpool_already_chose
181
181
if y_idx ≈ x[x_idxs... ] && ! maxpool_already_chose
182
- dx[x_idxs... ] += dy_idx* alpha + beta* dx[x_idxs... ]
182
+ dx[x_idxs... ] += dy_idx * alpha + beta * dx[x_idxs... ]
183
183
maxpool_already_chose = true
184
184
# Maxpooling does not support `beta` right now. :(
185
- # else
185
+ # else
186
186
# dx[x_idxs...] = T(0) + beta*dx[x_idxs...]
187
187
end
188
188
elseif $ (name == :mean )
189
189
# Either does meanpool :(
190
- dx[x_idxs... ] = dy_idx* alpha + dx[x_idxs... ]
190
+ dx[x_idxs... ] = dy_idx * alpha + dx[x_idxs... ]
191
191
else
192
192
error (" Unimplemented codegen path" )
193
193
end
@@ -210,19 +210,19 @@ for name in (:max, :mean)
210
210
# In these loops, we have to check that we're not reaching off the edge,
211
211
# we do so by putting in a bunch of conditionals. :/
212
212
for kd in 1 : kernel_d
213
- input_kd = project (d, stride_d, pad_d_lo) + (kd - 1 )* dil_d
213
+ input_kd = project (d, stride_d, pad_d_lo) + (kd - 1 ) * dil_d
214
214
if input_kd <= 0 || input_kd > depth
215
215
continue
216
216
end
217
217
218
218
for kh in 1 : kernel_h
219
- input_kh = project (h, stride_h, pad_h_lo) + (kh - 1 )* dil_h
219
+ input_kh = project (h, stride_h, pad_h_lo) + (kh - 1 ) * dil_h
220
220
if input_kh <= 0 || input_kh > height
221
221
continue
222
222
end
223
223
224
224
for kw in 1 : kernel_w
225
- input_kw = project (w, stride_w, pad_w_lo) + (kw - 1 )* dil_w
225
+ input_kw = project (w, stride_w, pad_w_lo) + (kw - 1 ) * dil_w
226
226
if input_kw <= 0 || input_kw > width
227
227
continue
228
228
end
@@ -233,13 +233,13 @@ for name in (:max, :mean)
233
233
# Uncomment line below if using with non-precise output
234
234
# if abs(y_idx - x[x_idxs...]) < 1e-5 && !maxpool_already_chose
235
235
if y_idx ≈ x[x_idxs... ] && ! maxpool_already_chose
236
- dx[x_idxs... ] += dy_idx* alpha + beta* dx[x_idxs... ]
236
+ dx[x_idxs... ] += dy_idx * alpha + beta * dx[x_idxs... ]
237
237
maxpool_already_chose = true
238
- # else
238
+ # else
239
239
# dx[x_idxs...] = T(0) + beta*dx[x_idxs...]
240
240
end
241
241
elseif $ (name == :mean )
242
- dx[x_idxs... ] += dy_idx* alpha + beta* dx[x_idxs... ]
242
+ dx[x_idxs... ] += dy_idx * alpha + beta * dx[x_idxs... ]
243
243
else
244
244
error (" Unimplemented codegen path" )
245
245
end
0 commit comments