Ako kontrolovať vstup rozmery model v Toku.jl?

0

Otázka

Mám resnet model, ktorý som pracoval s. Pôvodne som nahral do modelu pomocou série obrázkov. Teraz, že to je vyškolený, chcem urobiť záver, na jednej snímky (224x224 s 3 farebné kanály). Avšak, keď som prejsť na obrázok pre môj model cez model(imgs[:, :, :, 2]) Som si:

DimensionMismatch("Rank of x and w must match! (3 vs. 4)")

Stacktrace:
  [1] DenseConvDims(x::Array{Float32, 3}, w::Array{Float32, 4}; kwargs::Base.Iterators.Pairs{Symbol, Any, NTuple{4, Symbol}, NamedTuple{(:stride, :padding, :dilation, :groups), Tuple{Tuple{Int64, Int64}, Tuple{Int64, Int64}, Tuple{Int64, Int64}, Int64}}})
    @ NNlib ~/.julia/packages/NNlib/P9BhZ/src/dim_helpers/DenseConvDims.jl:58
  [2] (::Conv{2, 2, typeof(identity), Array{Float32, 4}, Vector{Float32}})(x::Array{Float32, 3})
    @ Flux ~/.julia/packages/Flux/ZnXxS/src/layers/conv.jl:162
...
...

Pre odkaz, imgs[:, :, :, 2] dáva:

224×224×3 Array{Float32, 3}:
[:, :, 1] =
 0.4       0.419608  0.482353  0.490196  …  0.623529  0.611765  0.627451
 0.423529  0.478431  0.513726  0.486275     0.65098   0.65098   0.65098
 0.419608  0.47451   0.541176  0.54902      0.682353  0.670588  0.639216
 0.52549   0.529412  0.568627  0.564706     0.588235  0.592157  0.572549
 0.556863  0.541176  0.513726  0.505882     0.603922  0.635294  0.654902
 0.486275  0.490196  0.521569  0.537255  …  0.635294  0.654902  0.65098
 0.529412  0.513726  0.533333  0.537255     0.603922  0.596078  0.596078
 0.521569  0.52549   0.505882  0.513726     0.580392  0.576471  0.572549
...
...

Nejakú predstavu, čo som chýba tu? Má model požadovať rovnaké rozmery počas záver, že to bol vyškolený na? Existuje spôsob, ako zistiť to, aby sa ubezpečil som dávať správny vstup rozmery?

Aktualizácia: uvedomil som si, že musím prejsť počet obrázkov (čo v tomto prípade je jedno), tak som robil:

img1 = cat(imgs[:, :, :, 1]; dims = ndims(imgs[:, :, :, 1]) + 1 )
img1
model(img1)

ktorý funguje tak, ako sa očakávalo. Nechám túto otázku otvorí, ak má niekto odpoveď na pôvodnú otázky týkajúce sa kontroly vstupu, matný.

flux.jl julia
2021-11-22 17:25:52
3

Najlepšiu odpoveď

4

Ako si objavil, NNlib.jl (knižnica, ktorá implementuje convolution pre Toku) očakáva, že vstup mať dávku rozmer. Ak ste sa prechádza jeden obraz, môžete pad a singleton rozmer. Existuje niekoľko spôsobov, ako dosiahnuť tento cieľ.

Prvý problém:

julia> size(x[:, :, :, 1])
(3, 3, 16)

Farebný obrázok by mal byť 4D (šírka výšky farba/hĺbka od dávky).

Jedna možnosť pad dávky rozmer je použitie rozsah index:

julia> size(x[:, :, :, 1:1])
(3, 3, 16, 1)

Ďalšou možnosťou, ak sú uvedené jedného obrázku ako 3D pole je použitie Flux.unsqueeze:

julia> size(Flux.unsqueeze(x[:, :, :, 1], ndims(x)))
(3, 3, 16, 1)

julia> all(Flux.unsqueeze(x[:, :, :, 1], ndims(x)) .== x[:, :, :, 1])
true

Prechádzame unsqueeze rozmer chceme pad ako argument. V našom prípade by to malo byť posledný rozmer x (t. j. dávka rozmer), ktoré môžeme získať v Julia s ndims(x).

2021-11-22 18:25:51
4

Ospravedlňujeme sa, ja naozaj nie je odborník, ale nie je problém, ktorý imgs[:, :, :, 2] prepravky 3-rozmerné tensor? Môže byť imgs[:, :, :, 2:2] bude fungovať, ako to robí štyroch rozmerov tensor s posledným rozmer sa rovná jednej (keďže máte jeden obrázok)

2021-11-22 18:23:47
3

Obe odpovede sú správne, naozaj. Jednoduchý reshape(x, size(x)..., 1) mali urobiť trik príliš, za predpokladu, že x je 3 trojrozmerný obraz tensor dostanete na indexovanie do dávky

2021-11-22 18:41:39

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................