-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathconv.jl
110 lines (90 loc) · 4.53 KB
/
conv.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
## convolution
function conv2d!{T}(y::CuArray{T}, x::CuArray{T}, w::CuArray{T};
handle=cudnnhandle(), algo=0, workSpace=C_NULL, workSpaceSizeInBytes=0,
alpha=1, beta=0, o...) # padding=0, stride=1, upscale=1, mode=0
@cuda(cudnn, cudnnConvolutionForward,
(Cptr,Ptr{T},Cptr,Ptr{T},Cptr,Ptr{T},Cptr,UInt32,Cptr,Csize_t,Ptr{T},Cptr,Ptr{T}),
handle,Ref(T(alpha)),TD(x),x,FD(w),w,CD(w,x;o...),algo,workSpace,
workSpaceSizeInBytes,Ref(T(beta)),TD(y),y)
return y
end
function conv2d{T}(x::CuArray{T}, w::CuArray{T};
handle=cudnnhandle(), algo=0, workSpace=C_NULL, workSpaceSizeInBytes=0, alpha=1,
o...) # padding=0, stride=1, upscale=1, mode=0
y = similar(x, cdims(w,x;o...))
conv2d!(y, x, w; handle=handle, algo=algo, workSpace=workSpace,
workSpaceSizeInBytes=workSpaceSizeInBytes, alpha=1, o...)
return y
end
function conv2_grad_x!{T}(dx::CuArray{T}, x::CuArray{T}, w::CuArray{T}, dy::CuArray{T};
handle=cudnnhandle(), alpha=1, algo=0, beta=0, workSpace=C_NULL,
workSpaceSizeInBytes=0, o...) # padding=0, stride=1, upscale=1, mode=0
cudnnVersion = cudnn_version()
if cudnnVersion >= 4000
@cuda(cudnn,cudnnConvolutionBackwardData,
(Cptr,Ptr{T},Cptr,Ptr{T},Cptr,Ptr{T},Cptr,UInt32,Cptr,Csize_t,Ptr{T},Cptr,Ptr{T}),
handle,Ref(T(alpha)),FD(w),w,TD(dy),dy,CD(w,x;o...),algo,workSpace,
workSpaceSizeInBytes,Ref(T(beta)),TD(dx),dx)
elseif cudnnVersion >= 3000
@cuda(cudnn,cudnnConvolutionBackwardData_v3,
(Cptr,Ptr{T},Cptr,Ptr{T},Cptr,Ptr{T},Cptr,UInt32,Cptr,Csize_t,Ptr{T},Cptr,Ptr{T}),
handle,Ref(T(alpha)),FD(w),w,TD(dy),dy,CD(w,x;o...),algo,workSpace,
workSpaceSizeInBytes,Ref(T(beta)),TD(dx),dx)
else
@cuda(cudnn,cudnnConvolutionBackwardData,
(Cptr,Ptr{T},Cptr,Ptr{T},Cptr,Ptr{T},Cptr,Ptr{T},Cptr,Ptr{T}),
handle,Ref(T(alpha)),FD(w),w,TD(dy),dy,CD(w,x;o...),
Ref(T(beta)),TD(dx),dx)
end
return dx
end
function conv2d_grad_x{T}(x::CuArray{T}, w::CuArray{T}, dy::CuArray{T};
handle=cudnnhandle(), alpha=1, algo=0, workSpace=C_NULL,
workSpaceSizeInBytes=0, o...) # padding=0, stride=1, upscale=1, mode=0
dx = similar(x)
conv2_grad_x!(dx, x, w, dy; handle=handle, alpha=alpha, algo=algo, workSpace=workSpace,
workSpaceSizeInBytes=workSpaceSizeInBytes, o...)
return dx
end
function conv2d_grad_w!{T}(dw::CuArray{T}, x::CuArray{T}, w::CuArray{T}, dy::CuArray{T};
handle=cudnnhandle(), alpha=1, beta=0, algo=0, workSpace=C_NULL,
workSpaceSizeInBytes=0,
o...) # padding=0, stride=1, upscale=1, mode=0
cudnnVersion = cudnn_version()
if cudnnVersion >= 4000
@cuda(cudnn,cudnnConvolutionBackwardFilter,
(Cptr,Ptr{T},Cptr,Ptr{T},Cptr,Ptr{T},Cptr,UInt32,Cptr,Csize_t,Ptr{T},Cptr,Ptr{T}),
handle,Ref(T(alpha)),TD(x),x,TD(dy),dy,CD(w,x;o...),algo,workSpace,
workSpaceSizeInBytes,Ref(T(beta)),FD(dw),dw)
elseif cudnnVersion >= 3000
@cuda(cudnn,cudnnConvolutionBackwardFilter_v3,
(Cptr,Ptr{T},Cptr,Ptr{T},Cptr,Ptr{T},Cptr,UInt32,Cptr,Csize_t,Ptr{T},Cptr,Ptr{T}),
handle,Ref(T(alpha)),TD(x),x,TD(dy),dy,CD(w,x;o...),algo,workSpace,
workSpaceSizeInBytes,Ref(T(beta)),FD(dw),dw)
else
@cuda(cudnn,cudnnConvolutionBackwardFilter,
(Cptr,Ptr{T},Cptr,Ptr{T},Cptr,Ptr{T},Cptr, Ptr{T},Cptr,Ptr{T}),
handle,Ref(T(alpha)),TD(x),x,TD(dy),dy,CD(w,x;o...),Ref(T(beta)),FD(dw),dw)
end
return dw
end
function conv2d_grad_w{T}(x::CuArray{T}, w::CuArray{T}, dy::CuArray{T};
handle=cudnnhandle(), alpha=1, algo=0, workSpace=C_NULL,
workSpaceSizeInBytes=0,
o...) # padding=0, stride=1, upscale=1, mode=0
dw = similar(w)
conv2d_grad_w!(dw, x, w, dy; handle=handle, alpha=alpha, algo=algo, workSpace=workSpace,
workSpaceSizeInBytes=workSpaceSizeInBytes, o...)
return dw
end
## deconvolution
function deconv2d(x, w; o...)
y = similar(x, dcdims(w, x; o...))
return conv2_grad_x(y, w, x; o...)
end
function deconv2_grad_w(x, w, dy; o...)
return conv2_grad_w(dy, w, x; o...)
end
function deconv2_grad_x(x, w, dy; o...)
return conv2d(dy, w; o...)
end