Conv
struct
defined in module
Flux
Conv(filter, in => out, σ = identity;
stride = 1, pad = 0, dilation = 1, groups = 1, [bias, init])
Standard convolutional layer.
filter
is a tuple of integers specifying the size of the convolutional kernel;
in
and
out
specify the number of input and output channels.
Image data should be stored in WHCN order (width, height, channels, batch). In other words, a 100×100 RGB image would be a
100×100×3×1
array, and a batch of 50 would be a
100×100×3×50
array. This has
N = 2
spatial dimensions, and needs a kernel size like
(5,5)
, a 2-tuple of integers.
To take convolutions along
N
feature dimensions, this layer expects as input an array with
ndims(x) == N+2
, where
size(x, N+1) == in
is the number of input channels, and
size(x, ndims(x))
is (as always) the number of observations in a batch. Then:
filter
should be a tuple of
N
integers.
Keywords
stride
and
dilation
should each be either single integer, or a tuple with
N
integers.
Keyword
pad
specifies the number of elements added to the borders of the data array. It can be
a single integer for equal padding all around,
a tuple of
N
integers, to apply the same padding at begin/end of each spatial dimension,
a tuple of
2*N
integers, for asymmetric padding, or
the singleton
SamePad()
, to calculate padding such that
size(output,d) == size(x,d) / stride
(possibly rounded) for each spatial dimension.
Keyword
groups
is expected to be an
Int
. It specifies the number of groups to divide a convolution into.
Keywords to control initialization of the layer:
init
- Function used to generate initial weights. Defaults to
glorot_uniform
.
bias
- The initial bias vector is all zero by default. Trainable bias can be disabled entirely by setting this to
false
, or another vector can be provided such as
bias = randn(Float32, out)
.
See also
ConvTranspose
,
DepthwiseConv
,
CrossCor
.
julia> xs = rand32(100, 100, 3, 50); # a batch of 50 RGB images
julia> layer = Conv((5,5), 3 => 7, relu; bias = false)
Conv((5, 5), 3 => 7, relu, bias=false) # 525 parameters
julia> layer(xs) |> size
(96, 96, 7, 50)
julia> Conv((5,5), 3 => 7; stride = 2)(xs) |> size
(48, 48, 7, 50)
julia> Conv((5,5), 3 => 7; stride = 2, pad = SamePad())(xs) |> size
(50, 50, 7, 50)
julia> Conv((1,1), 3 => 7; pad = (20,10,0,0))(xs) |> size
(130, 100, 7, 50)
julia> Conv((5,5), 3 => 7; stride = 2, dilation = 4)(xs) |> size
(42, 42, 7, 50)
Conv(weight::AbstractArray, [bias, activation; stride, pad, dilation])
Constructs a convolutional layer with the given weight and bias. Accepts the same keywords and has the same defaults as [
Conv(k::NTuple{N,Integer}, ch::Pair{<:Integer,<:Integer}, σ; ...)
]( Conv).
julia> weight = rand(3, 4, 5);
julia> bias = zeros(5);
julia> layer = Conv(weight, bias, sigmoid) # expects 1 spatial dimension
Conv((3,), 4 => 5, σ) # 65 parameters
julia> layer(randn(100, 4, 64)) |> size
(98, 5, 64)
julia> Flux.params(layer) |> length
2
There are
3
methods for Flux.Conv
:
The following pages link back here:
models/blocks.jl , models/layers.jl , models/xresnet.jl , Flux.jl , layers/conv.jl , layers/show.jl