.FluxBilinear
struct defined in module
Flux
Bilinear((in1, in2) => out, σ=identity; bias=true, init=glorot_uniform)
Bilinear(W::AbstractArray, [bias, σ])
Creates a layer which is fully connected between two inputs and the output, and otherwise similar to
Dense. Its output, given vectors
x &
y, is another vector
z with, for all
i ∈ 1:out:
z[i] = σ(x' * W[i,:,:] * y + bias[i])
If
x and
y are matrices, then each column of the output
z = B(x, y) is of this form, with
B the Bilinear layer.
If the second input
y is not given, it is taken to be equal to
x, i.e.
B(x) == B(x, x)
The two inputs may also be provided as a tuple,
B((x, y)) == B(x, y), which is accepted as the input to a
Chain.
If the two input sizes are the same,
in1 == in2, then you may write
Bilinear(in => out, σ).
The initialisation works as for
Dense layer, with
W = init(out, in1, in2). By default the bias vector is
zeros(Float32, out), option
bias=false will switch off trainable bias. Either of these may be provided explicitly.
julia> x, y = randn(Float32, 5, 32), randn(Float32, 5, 32);
julia> B = Flux.Bilinear((5, 5) => 7)
Bilinear(5 => 7) # 182 parameters
julia> B(x) |> size # interactions based on one input
(7, 32)
julia> B(x,y) == B((x,y)) # two inputs, may be given as a tuple
true
julia> sc = SkipConnection(
Chain(Dense(5 => 20, tanh), Dense(20 => 9, tanh)),
Flux.Bilinear((9, 5) => 3, bias=false),
); # used as the recombinator, with skip as the second input
julia> sc(x) |> size
(3, 32)
julia> Flux.Bilinear(rand(4,8,16), false, tanh) # first dim of weight is the output
Bilinear((8, 16) => 4, tanh; bias=false) # 512 parameters
There are
4
methods for Flux.Bilinear:
The following pages link back here: