Comment vérifier l'entrée des dimensions d'un modèle de Flux.jl?

0

La question

J'ai un resnet modèle qui je travaille. Au départ, j'avais formé le modèle à l'aide des lots d'images. Maintenant qu'il est formé, je veux faire de l'inférence sur une seule image (224x224 avec 3 couches de couleur). Cependant, lorsque je passe l'image de mon modèle via model(imgs[:, :, :, 2]) J'obtiens:

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

Pour référence, imgs[:, :, :, 2] donne:

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

Toute idée de ce que je suis en manque ici? Le modèle exigent les mêmes dimensions lors de l'inférence qu'il été formé? EST-il un moyen de vérifier cela pour m'assurer que je suis de donner les bonnes dimensions initiales?

Mise à jour: j'ai réalisé que j'ai besoin de passer dans le nombre d'images (qui dans ce cas est une), j'ai donc fait:

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

qui fonctionne comme prévu. Je vais laisser cette question ouverte si quelqu'un a une réponse à des questions concernant la vérification de l'entrée s'estompe.

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

La meilleure réponse

4

Comme vous l'avez découvert, NNlib.jl (la bibliothèque qui implémente la convolution pour le Flux) s'attend à l'entrée pour avoir le lot de dimension. Si vous êtes de passage à travers une seule image, vous pouvez remplir un singleton dimension. Il y a plusieurs moyens d'y parvenir.

Tout d'abord, le problème:

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

Une couleur de l'image doit être 4D (largeur par hauteur par couleur/profondeur par lot).

Une option pour ajouter un lot de dimension est d'utiliser une gamme pour l'index:

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

Une autre option, si vous êtes donné une seule image comme un tableau 3D est d'utiliser 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

Nous passons unsqueeze la dimension que nous voulons tapis comme un argument. Dans notre cas, ce devrait être la dernière dimension de x (c'est à dire le lot de dimension) à laquelle nous pouvons obtenir en avec Julia ndims(x).

2021-11-22 18:25:51
4

Désolé, je ne suis vraiment pas un expert, mais n'est pas le problème imgs[:, :, :, 2] caisses en 3 dimensions tenseur? Peut-être imgs[:, :, :, 2:2] serait de travailler, ça fait quatre dimensions tenseur avec la dernière dimension égale à un (puisque vous avez une image)

2021-11-22 18:23:47
3

Les deux réponses sont correctes, vraiment. Un simple reshape(x, size(x)..., 1) devrait faire l'affaire, en supposant que x est la est la en 3 dimensions de l'image tenseur que vous obtenez sur l'indexation dans le lot

2021-11-22 18:41:39

Dans d'autres langues

Cette page est dans d'autres langues

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