From f6097d58d6416a842509c915c5d07da9e28dc4d6 Mon Sep 17 00:00:00 2001 From: tejank10 Date: Sun, 15 Apr 2018 12:15:41 +0530 Subject: [PATCH 1/5] Scalar pad/stride for Conv constructor --- src/layers/conv.jl | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/layers/conv.jl b/src/layers/conv.jl index 994648c2..e8054829 100644 --- a/src/layers/conv.jl +++ b/src/layers/conv.jl @@ -24,11 +24,16 @@ Conv(w::AbstractArray{T}, b::AbstractVector{T}, σ = identity; stride = 1, pad = 0) where T = Conv(σ, w, b, stride, pad) +#Conv(k::NTuple{N,Integer}, ch::Pair{<:Integer,<:Integer}, σ = identity; init = initn, +# stride::NTuple{N,Integer} = map(_->1,k), +# pad::NTuple{N,Integer} = map(_->0,k)) where N = +# Conv(param(init(k..., ch...)), param(zeros(ch[2])), σ, +# stride = stride, pad = pad) + Conv(k::NTuple{N,Integer}, ch::Pair{<:Integer,<:Integer}, σ = identity; init = initn, - stride::NTuple{N,Integer} = map(_->1,k), - pad::NTuple{N,Integer} = map(_->0,k)) where N = + stride::Integer = 1, pad::Integer = 0) where N = Conv(param(init(k..., ch...)), param(zeros(ch[2])), σ, - stride = stride, pad = pad) + stride = map(_->stride,k), pad = map(_->pad,k)) Flux.treelike(Conv) From b080f5c82e080d2aebff2f5f00c5d2612da2e4d9 Mon Sep 17 00:00:00 2001 From: tejank10 Date: Sun, 15 Apr 2018 20:32:40 +0530 Subject: [PATCH 2/5] Scalar pad and stride --- src/layers/conv.jl | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/layers/conv.jl b/src/layers/conv.jl index e8054829..addef9fc 100644 --- a/src/layers/conv.jl +++ b/src/layers/conv.jl @@ -1,5 +1,8 @@ using NNlib: conv +expand(::Type{Val{N}}, i::Integer) where N = ntuple(_ -> i, Val{N}) +expand(::Type{Val{N}}, i::NTuple{N, Integer}) where N = i + """ Conv(size, in=>out) Conv(size, in=>out, relu) @@ -24,16 +27,10 @@ Conv(w::AbstractArray{T}, b::AbstractVector{T}, σ = identity; stride = 1, pad = 0) where T = Conv(σ, w, b, stride, pad) -#Conv(k::NTuple{N,Integer}, ch::Pair{<:Integer,<:Integer}, σ = identity; init = initn, -# stride::NTuple{N,Integer} = map(_->1,k), -# pad::NTuple{N,Integer} = map(_->0,k)) where N = -# Conv(param(init(k..., ch...)), param(zeros(ch[2])), σ, -# stride = stride, pad = pad) - Conv(k::NTuple{N,Integer}, ch::Pair{<:Integer,<:Integer}, σ = identity; init = initn, - stride::Integer = 1, pad::Integer = 0) where N = + stride = 1, pad = 0) where N = Conv(param(init(k..., ch...)), param(zeros(ch[2])), σ, - stride = map(_->stride,k), pad = map(_->pad,k)) + stride = expand(Val{N}, stride), pad = expand(Val{N}, pad)) Flux.treelike(Conv) From 2f5473d4351be3302fdf31a4bdb81810fe05b4f6 Mon Sep 17 00:00:00 2001 From: tejank10 Date: Mon, 16 Apr 2018 00:59:11 +0530 Subject: [PATCH 3/5] added expand in conv constructor --- src/layers/conv.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/layers/conv.jl b/src/layers/conv.jl index addef9fc..9c2ba9c3 100644 --- a/src/layers/conv.jl +++ b/src/layers/conv.jl @@ -24,8 +24,9 @@ struct Conv{N,F,A,V} end Conv(w::AbstractArray{T}, b::AbstractVector{T}, σ = identity; - stride = 1, pad = 0) where T = - Conv(σ, w, b, stride, pad) + stride = 1, pad = 0) where T = + Conv(σ, w, b, expand(Val{ndims(w) - 2}, stride), + pad = expand(Val{ndims(w) - 2}, pad)) Conv(k::NTuple{N,Integer}, ch::Pair{<:Integer,<:Integer}, σ = identity; init = initn, stride = 1, pad = 0) where N = From 2ef25775c678acf2b7ab92dccc2fcb171ba222f7 Mon Sep 17 00:00:00 2001 From: tejank10 Date: Mon, 16 Apr 2018 01:18:26 +0530 Subject: [PATCH 4/5] removed extra expand and fixed bug --- src/layers/conv.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/layers/conv.jl b/src/layers/conv.jl index 9c2ba9c3..1ef38a21 100644 --- a/src/layers/conv.jl +++ b/src/layers/conv.jl @@ -26,12 +26,12 @@ end Conv(w::AbstractArray{T}, b::AbstractVector{T}, σ = identity; stride = 1, pad = 0) where T = Conv(σ, w, b, expand(Val{ndims(w) - 2}, stride), - pad = expand(Val{ndims(w) - 2}, pad)) + expand(Val{ndims(w) - 2}, pad)) Conv(k::NTuple{N,Integer}, ch::Pair{<:Integer,<:Integer}, σ = identity; init = initn, stride = 1, pad = 0) where N = - Conv(param(init(k..., ch...)), param(zeros(ch[2])), σ, - stride = expand(Val{N}, stride), pad = expand(Val{N}, pad)) + Conv(param(init(k..., ch...)), param(zeros(ch[2])), σ; + stride = stride, pad = pad) Flux.treelike(Conv) From 7726a5b605832b0fc35e26332a0f0f83a5d5f210 Mon Sep 17 00:00:00 2001 From: Mike J Innes Date: Tue, 26 Jun 2018 14:05:07 +0100 Subject: [PATCH 5/5] inferrable --- src/layers/conv.jl | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/layers/conv.jl b/src/layers/conv.jl index 7548fc96..38310aad 100644 --- a/src/layers/conv.jl +++ b/src/layers/conv.jl @@ -1,7 +1,9 @@ using NNlib: conv -expand(::Type{Val{N}}, i::Integer) where N = ntuple(_ -> i, Val{N}) -expand(::Type{Val{N}}, i::NTuple{N, Integer}) where N = i +@generated sub2(::Type{Val{N}}) where N = :(Val{$(N-2)}) + +expand(N, i::Tuple) = i +expand(N, i::Integer) = ntuple(_ -> i, N) """ Conv(size, in=>out) @@ -24,9 +26,9 @@ struct Conv{N,F,A,V} dilation::NTuple{N,Int} end -Conv(w::AbstractArray{T}, b::AbstractVector{T}, σ = identity; - stride = 1, pad = 0, dilation = 1) where T = - Conv(σ, w, b, expand.(Val{ndims(w)-2}, (stride, pad, dilation))...) +Conv(w::AbstractArray{T,N}, b::AbstractVector{T}, σ = identity; + stride = 1, pad = 0, dilation = 1) where {T,N} = + Conv(σ, w, b, expand.(sub2(Val{N}), (stride, pad, dilation))...) Conv(k::NTuple{N,Integer}, ch::Pair{<:Integer,<:Integer}, σ = identity; init = initn, stride = 1, pad = 0, dilation = 1) where N =