Jak zkontrolovat vstupní rozměry model v pohybu.jl?

0

Otázka

Mám resnet model, který jsem pracovat. Původně jsem trénoval modelu pomocí šarží obrazů. Nyní, že je vycvičený, chci dělat závěr na jediném snímku (224x224 s 3 barevné kanály). Nicméně, když jsem se projít obraz mého modelu prostřednictvím model(imgs[:, :, :, 2]) Jsem se:

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
...
...

Pro referenční, imgs[:, :, :, 2] dává:

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
...
...

Nějaký nápad, co jsem zde chybí? Dělá model vyžadují stejné rozměry v závěr, že to byl vycvičený na? Existuje způsob, jak zkontrolovat a ujistěte se, že dávám správné vstupní rozměry?

Aktualizace: jsem si uvědomil, že musím projít v počtu snímků (což je v tomto případě jedna), tak jsem to udělal:

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

která funguje, jak se očekávalo. Nechám tuto otázku otevřenou, jestli má někdo odpověď na původní otázky o kontrolu vstupních ztlumí.

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

Nejlepší odpověď

4

Jak jste zjistil, NNlib.jl (knihovna, která implementuje konvoluce pro Tok) očekává, že vstup mají dávkový rozměr. Pokud jste procházející jednoho obrazu, můžete pad singleton rozměr. Existuje několik způsobů, jak tohoto dosáhnout.

První problém:

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

Barevný obrázek by měl být 4D (šířka do výška podle barev/hloubky jednotlivých šarží).

Jednou z možností pad dávkový rozměr je použít rozsah pro index:

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

Další možností, pokud jste dostal jeden obraz jako 3D pole je použít 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

Jsme se projít unsqueeze rozměr chceme pad jako argument. V našem případě, to by mělo být poslední rozměr x (tj. dávkový rozměr), které můžeme dostat v Julia s ndims(x).

2021-11-22 18:25:51
4

Promiň, opravdu nejsem expert, ale není problém, že imgs[:, :, :, 2] bedny 3-dimenzionální tenzor? Může-být imgs[:, :, :, 2:2] bude fungovat, jak to dělá čtyři dimenzionální tenzor s poslední rozměr roven jedné (protože máte jeden obrázek)

2021-11-22 18:23:47
3

Obě odpovědi jsou správné, opravdu. Jednoduchý reshape(x, size(x)..., 1) to by mělo stačit taky, za předpokladu, že x je je 3 rozměrný obraz tenzor dostanete na indexování do šarže

2021-11-22 18:41:39

V jiných jazycích

Tato stránka je v jiných jazycích

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