logo

ジュリアフラックスで隠れ層を扱う方法 📂機械学習

ジュリアフラックスで隠れ層を扱う方法

線形1

Fluxで、線形層はDense()で実装できる。

  • Dense(in, out, σ=identity; bias=true, init=glorot_uniform)
  • Dense(W::AbstractMatrix, [bias, σ]

活性化関数のデフォルト値は恒等関数だ。reluやtanh、sigmoidなどのよく知られた関数を使うことができる。

julia> Dense(5, 2)
Dense(5, 2)         # 12 parameters

julia> Dense(5, 2, relu)
Dense(5, 2, relu)   # 12 parameters

julia> Dense(5, 2, sigmoid)
Dense(5, 2, σ)  

julia> d1 = Dense(ones(2, 5), false, tanh)  # using provided weight matrix
Dense(5, 2, tanh; bias=false)  # 10 parameters

julia> d1(ones(5))
2-element Vector{Float64}:
 0.9999092042625951
 0.9999092042625951

畳み込み2

Fluxで、畳み込み層はConv()で実装できる。

Conv(filter, in => out, σ = identity;
    stride = 1, pad = 0, dilation = 1, groups = 1, [bias, weight, init])
  • filter:カーネルのサイズをタプル(m,n)で入力する。
  • in => out:入力層のチャンネル数と出力層のチャンネル数を入力する。

畳み込み層を使う時、注意しなければならないのは入力として使う配列は常に4次元配列でなければならないことだ。白黒写真1枚であっても(Height, Width)ではなく、(Height, Width, 1, 1)のサイズで入力しなければならない。RGBカラー写真11枚ならば、サイズは(Height, Width, 3, 11)でなければならない。

julia> A = rand(Float32, 4,4,1,1)
4×4×1×1 Array{Float32, 4}:
[:, :, 1, 1] =
 0.645447  0.459486  0.427283   0.631972
 0.365584  0.821914  0.526104   0.853083
 0.61417   0.813586  0.0317676  0.0636574
 0.151384  0.824513  0.308647   0.260465

julia> c = Conv((2,2), 1 => 3, relu; bias = false)
Conv((2, 2), 1 => 3, relu, bias=false)  # 12 parameters

julia> c(A)
3×3×3×1 Array{Float32, 4}:
[:, :, 1, 1] =
 0.590182  0.166435  0.441105
 0.388874  0.207832  0.466098
 0.736932  0.206818  0.0

[:, :, 2, 1] =
 0.283607  0.12781  0.350034
 0.339908  0.0      0.0
 0.314565  0.0      0.120079

[:, :, 3, 1] =
 0.0       0.36956   0.0787188
 0.196548  0.715786  0.308148
 0.0       0.425667  0.055858

プーリング層3

  • maxpool(x, k::NTuple; pad=0, stride=k)
  • meanpool(x, k::NTuple; pad=0, stride=k)

環境

  • OS: Windows10
  • Version: Julia 1.6.2, Flux 0.12.8