@@ -10,9 +10,9 @@ function psize(p, x)
10
10
end
11
11
end
12
12
13
- function im2col_2d! {T} (img:: AbstractArray{T,3} , col:: AbstractArray{T,2} , width:: Int , height:: Int , channels:: Int ,
13
+ function im2col_2d! (img:: AbstractArray{T,3} , col:: AbstractArray{T,2} , width:: Int , height:: Int , channels:: Int ,
14
14
kernel_w:: Int , kernel_h:: Int , pad_w:: Int , pad_h:: Int , stride_w:: Int , stride_h:: Int ,
15
- dil_w:: Int , dil_h:: Int , mode:: Int )
15
+ dil_w:: Int , dil_h:: Int , mode:: Int ) where T
16
16
17
17
height_col = div (height + 2 pad_h - (kernel_h - 1 ) * dil_h - 1 , stride_h) + 1
18
18
width_col = div (width + 2 pad_w - (kernel_w - 1 ) * dil_w - 1 , stride_w) + 1
@@ -42,9 +42,9 @@ function im2col_2d!{T}(img::AbstractArray{T,3}, col::AbstractArray{T,2}, width::
42
42
end
43
43
end
44
44
45
- function col2im_2d! {T} (col:: AbstractArray{T,2} , img:: AbstractArray{T,3} , width:: Int , height:: Int ,
45
+ function col2im_2d! (col:: AbstractArray{T,2} , img:: AbstractArray{T,3} , width:: Int , height:: Int ,
46
46
channels:: Int , kernel_w:: Int , kernel_h:: Int , pad_w:: Int , pad_h:: Int , stride_w:: Int ,
47
- stride_h:: Int , dil_h :: Int , dil_w :: Int , mode:: Int )
47
+ stride_h:: Int , dil_w :: Int , dil_h :: Int , mode:: Int ) where T
48
48
49
49
height_col = div (height + 2 pad_h - (kernel_h - 1 ) * dil_h - 1 , stride_h) + 1
50
50
width_col = div (width + 2 pad_w - (kernel_w - 1 ) * dil_w - 1 , stride_w) + 1
@@ -71,9 +71,9 @@ function col2im_2d!{T}(col::AbstractArray{T,2}, img::AbstractArray{T,3}, width::
71
71
end
72
72
end
73
73
74
- function im2col_3d! {T} (img:: AbstractArray{T,4} , col:: AbstractArray{T,2} , width:: Int , height:: Int , depth:: Int ,
74
+ function im2col_3d! (img:: AbstractArray{T,4} , col:: AbstractArray{T,2} , width:: Int , height:: Int , depth:: Int ,
75
75
channels:: Int , kernel_w:: Int , kernel_h:: Int , kernel_d:: Int , pad_w:: Int , pad_h:: Int , pad_d:: Int ,
76
- stride_w:: Int , stride_h:: Int , stride_d:: Int , dil_w:: Int , dil_h:: Int , dil_d:: Int , mode:: Int )
76
+ stride_w:: Int , stride_h:: Int , stride_d:: Int , dil_w:: Int , dil_h:: Int , dil_d:: Int , mode:: Int ) where T
77
77
78
78
height_col = div (height + 2 pad_h - (kernel_h - 1 ) * dil_h - 1 , stride_h) + 1
79
79
width_col = div (width + 2 pad_w - (kernel_w - 1 ) * dil_w - 1 , stride_w) + 1
@@ -107,10 +107,10 @@ function im2col_3d!{T}(img::AbstractArray{T,4}, col::AbstractArray{T,2}, width::
107
107
end
108
108
end
109
109
110
- function col2im_3d! {T} (col:: AbstractArray{T,2} , img:: AbstractArray{T,4} , width:: Int , height:: Int ,
110
+ function col2im_3d! (col:: AbstractArray{T,2} , img:: AbstractArray{T,4} , width:: Int , height:: Int ,
111
111
depth:: Int , channels:: Int , kernel_w:: Int , kernel_h:: Int , kernel_d:: Int ,
112
112
pad_w:: Int , pad_h:: Int , pad_d:: Int , stride_w:: Int , stride_h:: Int , stride_d:: Int ,
113
- dil_w:: Int , dil_h:: Int , dil_d:: Int , mode:: Int )
113
+ dil_w:: Int , dil_h:: Int , dil_d:: Int , mode:: Int ) where T
114
114
115
115
height_col = div (height + 2 pad_h - (kernel_h - 1 ) * dil_h - 1 , stride_h) + 1
116
116
width_col = div (width + 2 pad_w - (kernel_w - 1 ) * dil_w - 1 , stride_w) + 1
@@ -159,15 +159,14 @@ function dilation_dims(w, dilation = 1)
159
159
end
160
160
end
161
161
162
- function im2col_dims (w,y,dilation = 1 )
162
+ function im2col_dims (w,y)
163
163
N = ndims (y)
164
- dil = dilation_dims (w, dilation)
165
164
r,c = 1 ,1
166
165
for i= 1 : N- 2
167
166
r *= size (y,i)
168
- c *= dil[i]
167
+ c *= size (w,i)
169
168
end
170
- c *= dil[ N- 1 ]
169
+ c *= size (w, N- 1 )
171
170
return (r, c)
172
171
end
173
172
@@ -183,7 +182,7 @@ function im2col_dims(w::NTuple{4, Int}, y)
183
182
end
184
183
185
184
function depthwiseconv2d! (y:: AbstractArray{T,4} , x:: AbstractArray{T,4} , w:: AbstractArray{T,4} ;
186
- padding = 0 , stride = 1 , mode = 1 , alpha = T (1 )) where {T <: Real }
185
+ padding = 0 , stride = 1 , mode = 1 , alpha = T (1 )) where T
187
186
Wx,Hx,Cx,Nx = size (x)
188
187
Ww,Hw,Cm,Cw = size (w) # Cm = Channel Multiplier
189
188
@assert Cx == Cw DimensionMismatch ()
@@ -206,7 +205,7 @@ function depthwiseconv2d!(y::AbstractArray{T,4}, x::AbstractArray{T,4}, w::Abstr
206
205
end
207
206
208
207
function depthwiseconv2d_grad_w! (dw:: AbstractArray{T,4} , x:: AbstractArray{T,4} , w:: AbstractArray{T,4} , dy:: AbstractArray{T,4} ;
209
- padding= 0 , stride= 1 , mode= 0 , alpha= 1 ) where {T <: Real }
208
+ padding= 0 , stride= 1 , mode= 0 , alpha= 1 ) where T
210
209
Wx,Hx,Cx,Nx = size (x)
211
210
Ww,Hw,Cm,Cw = size (w) # Cm = Channel Multiplier
212
211
@assert Cx == Cw DimensionMismatch ()
@@ -232,8 +231,8 @@ function depthwiseconv2d_grad_w!(dw::AbstractArray{T,4}, x::AbstractArray{T,4},
232
231
return dw
233
232
end
234
233
235
- function depthwiseconv2d_grad_x! {T} (dx:: AbstractArray{T,4} , x:: AbstractArray{T,4} , w:: AbstractArray{T,4} , dy:: AbstractArray{T,4} ;
236
- padding= 0 , stride= 1 , mode= 0 , alpha= 1 )
234
+ function depthwiseconv2d_grad_x! (dx:: AbstractArray{T,4} , x:: AbstractArray{T,4} , w:: AbstractArray{T,4} , dy:: AbstractArray{T,4} ;
235
+ padding= 0 , stride= 1 , mode= 0 , alpha= 1 ) where T
237
236
Wx,Hx,Cx,Nx = size (x)
238
237
Ww,Hw,Cm,Cw = size (w) # Cm = Channel Multiplier
239
238
@assert Cx == Cw DimensionMismatch ()
@@ -257,14 +256,14 @@ function depthwiseconv2d_grad_x!{T}(dx::AbstractArray{T,4}, x::AbstractArray{T,4
257
256
return dx
258
257
end
259
258
260
- function conv2d! {T} (y:: AbstractArray{T,4} , x:: AbstractArray{T,4} , w:: AbstractArray{T,4} ;
261
- padding= 0 , stride= 1 , dilation= 1 , mode= 0 , alpha= T (1 ))
259
+ function conv2d! (y:: AbstractArray{T,4} , x:: AbstractArray{T,4} , w:: AbstractArray{T,4} ;
260
+ padding= 0 , stride= 1 , dilation= 1 , mode= 0 , alpha= T (1 )) where T
262
261
if mode != 0 && mode != 1 ; throw (ArgumentError (" conv2d only supports mode=0 or 1." )); end
263
262
Wx,Hx,Cx,Nx = size (x)
264
- Ww,Hw,C1,C2 = dilation_dims (w, dilation )
263
+ Ww,Hw,C1,C2 = size (w )
265
264
if Cx!= C1; throw (DimensionMismatch ()); end
266
265
Wy,Hy,Cy,Ny = size (y)
267
- x2dims = im2col_dims (w,y,dilation )
266
+ x2dims = im2col_dims (w,y)
268
267
x2 = similar (x, x2dims)
269
268
(p1,p2) = psize (padding,x)
270
269
(s1,s2) = psize (stride,x)
@@ -279,15 +278,15 @@ function conv2d!{T}(y::AbstractArray{T,4}, x::AbstractArray{T,4}, w::AbstractArr
279
278
return y
280
279
end
281
280
282
- function conv2d_grad_w! {T} (dw:: AbstractArray{T,4} , x:: AbstractArray{T,4} , w:: AbstractArray{T,4} , dy:: AbstractArray{T,4} ;
283
- padding= 0 , stride= 1 , dilation= 1 , mode= 0 , alpha= 1 )
281
+ function conv2d_grad_w! (dw:: AbstractArray{T,4} , x:: AbstractArray{T,4} , w:: AbstractArray{T,4} , dy:: AbstractArray{T,4} ;
282
+ padding= 0 , stride= 1 , dilation= 1 , mode= 0 , alpha= 1 ) where T
284
283
# dw = x'*dy
285
284
Wx,Hx,Cx,Nx = size (x)
286
- Ww,Hw,C1,C2 = dilation_dims (w, dilation )
285
+ Ww,Hw,C1,C2 = size (w )
287
286
Wy,Hy,Cy,Ny = size (dy)
288
287
# if mode != 0 && mode != 1; throw(ArgumentError("conv2d only supports mode=0 or 1.")); end
289
288
# @assert Cx==C1 && Cy==C2 && Ny==Nx
290
- x2dims = im2col_dims (w,dy,dilation )
289
+ x2dims = im2col_dims (w,dy)
291
290
x2 = similar (x, x2dims)
292
291
# op(A) is an m-by-k matrix, op(B) is a k-by-n matrix, C is an m-by-n matrix.
293
292
Y,M,N,K = Wy* Hy* Cy,Ww* Hw* Cx,Cy,Wy* Hy
@@ -304,15 +303,15 @@ function conv2d_grad_w!{T}(dw::AbstractArray{T,4}, x::AbstractArray{T,4}, w::Abs
304
303
return dw
305
304
end
306
305
307
- function conv2d_grad_x! {T} (dx:: AbstractArray{T,4} , x:: AbstractArray{T,4} , w:: AbstractArray{T,4} , dy:: AbstractArray{T,4} ;
308
- padding= 0 , stride= 1 , dilation= 1 , mode= 0 , alpha= 1 )
306
+ function conv2d_grad_x! (dx:: AbstractArray{T,4} , x:: AbstractArray{T,4} , w:: AbstractArray{T,4} , dy:: AbstractArray{T,4} ;
307
+ padding= 0 , stride= 1 , dilation= 1 , mode= 0 , alpha= 1 ) where T
309
308
# dx = dy*w'
310
309
Wx,Hx,Cx,Nx = size (x)
311
- Ww,Hw,C1,C2 = dilation_dims (w, dilation )
310
+ Ww,Hw,C1,C2 = size (w )
312
311
Wy,Hy,Cy,Ny = size (dy)
313
312
# if mode != 0 && mode != 1; throw(ArgumentError("conv2d only supports mode=0 or 1.")); end
314
313
@assert Cx== C1 && Cy== C2 && Ny== Nx
315
- x2dims = im2col_dims (w,dy,dilation )
314
+ x2dims = im2col_dims (w,dy)
316
315
x2 = similar (x, x2dims)
317
316
# op(A) is an m-by-k matrix, op(B) is a k-by-n matrix, C is an m-by-n matrix.
318
317
Y,M,N,K = Wy* Hy* Cy,Wy* Hy,Ww* Hw* Cx,Cy
@@ -367,15 +366,15 @@ function col2im2d!(w::AbstractArray{T,4}, x::AbstractArray{T,4}, x2::AbstractArr
367
366
return x
368
367
end
369
368
370
- function conv3d! {T} (y:: AbstractArray{T,5} , x:: AbstractArray{T,5} , w:: AbstractArray{T,5} ;
371
- padding= 0 , stride= 1 , dilation = 1 , mode= 0 , alpha= T (1 ))
369
+ function conv3d! (y:: AbstractArray{T,5} , x:: AbstractArray{T,5} , w:: AbstractArray{T,5} ;
370
+ padding= 0 , stride= 1 , dilation = 1 , mode= 0 , alpha= T (1 )) where T
372
371
if mode != 0 && mode != 1 ; throw (ArgumentError (" conv3d only supports mode=0 or 1." )); end
373
372
Wx,Hx,Dx,Cx,Nx = size (x)
374
- Ww,Hw,Dw,C1,C2 = dilation_dims (w, dilation )
373
+ Ww,Hw,Dw,C1,C2 = size (w )
375
374
if Cx!= C1; throw (DimensionMismatch ()); end
376
375
Wy,Hy,Dy,Cy,Ny = size (y)
377
376
# @assert Cy==C2 && Ny==Nx
378
- x2dims = im2col_dims (w,y,dilation )
377
+ x2dims = im2col_dims (w,y)
379
378
x2 = similar (x, x2dims)
380
379
(p1,p2,p3) = psize (padding,x)
381
380
(s1,s2,s3) = psize (stride,x)
@@ -391,15 +390,15 @@ function conv3d!{T}(y::AbstractArray{T,5}, x::AbstractArray{T,5}, w::AbstractArr
391
390
return y
392
391
end
393
392
394
- function conv3d_grad_w! {T} (dw:: AbstractArray{T,5} , x:: AbstractArray{T,5} , w:: AbstractArray{T,5} , dy:: AbstractArray{T,5} ;
395
- padding= 0 , stride= 1 , dilation = 1 , mode= 0 , alpha= 1 )
393
+ function conv3d_grad_w! (dw:: AbstractArray{T,5} , x:: AbstractArray{T,5} , w:: AbstractArray{T,5} , dy:: AbstractArray{T,5} ;
394
+ padding= 0 , stride= 1 , dilation = 1 , mode= 0 , alpha= 1 ) where T
396
395
# dw = x'*dy
397
396
Wx,Hx,Dx,Cx,Nx = size (x)
398
- Ww,Hw,Dw,C1,C2 = dilation_dims (w, dilation )
397
+ Ww,Hw,Dw,C1,C2 = size (w )
399
398
Wy,Hy,Dy,Cy,Ny = size (dy)
400
399
# if mode != 0 && mode != 1; throw(ArgumentError("conv2d only supports mode=0 or 1.")); end
401
400
# @assert Cx==C1 && Cy==C2 && Ny==Nx
402
- x2dims = im2col_dims (w,dy,dilation )
401
+ x2dims = im2col_dims (w,dy)
403
402
x2 = similar (x, x2dims)
404
403
# op(A) is an m-by-k matrix, op(B) is a k-by-n matrix, C is an m-by-n matrix.
405
404
Y,M,N,K = Wy* Hy* Dy* Cy,Ww* Hw* Dw* Cx,Cy,Wy* Hy* Dy
@@ -416,15 +415,15 @@ function conv3d_grad_w!{T}(dw::AbstractArray{T,5}, x::AbstractArray{T,5}, w::Abs
416
415
return dw
417
416
end
418
417
419
- function conv3d_grad_x! {T} (dx:: AbstractArray{T,5} , x:: AbstractArray{T,5} , w:: AbstractArray{T,5} , dy:: AbstractArray{T,5} ;
420
- padding= 0 , stride= 1 , dilation = 1 , mode= 0 , alpha= 1 )
418
+ function conv3d_grad_x! (dx:: AbstractArray{T,5} , x:: AbstractArray{T,5} , w:: AbstractArray{T,5} , dy:: AbstractArray{T,5} ;
419
+ padding= 0 , stride= 1 , dilation = 1 , mode= 0 , alpha= 1 ) where T
421
420
# dx = dy*w'
422
421
Wx,Hx,Dx,Cx,Nx = size (x)
423
- Ww,Hw,Dw,C1,C2 = dilation_dims (w, dilation )
422
+ Ww,Hw,Dw,C1,C2 = size (w )
424
423
Wy,Hy,Dy,Cy,Ny = size (dy)
425
424
# if mode != 0 && mode != 1; throw(ArgumentError("conv2d only supports mode=0 or 1.")); end
426
425
@assert Cx== C1 && Cy== C2 && Ny== Nx
427
- x2dims = im2col_dims (w,dy,dilation )
426
+ x2dims = im2col_dims (w,dy)
428
427
x2 = similar (x, x2dims)
429
428
# op(A) is an m-by-k matrix, op(B) is a k-by-n matrix, C is an m-by-n matrix.
430
429
Y,M,N,K = Wy* Hy* Dy* Cy,Wy* Hy* Dy,Ww* Hw* Dw* Cx,Cy
0 commit comments