Cómo comprobar la entrada de las dimensiones de un modelo en el Flujo.jl?

0

Pregunta

Tengo un resnet modelo en el que estoy trabajando. Originalmente entrenado el modelo de uso de lotes de imágenes. Ahora que está capacitado, quiero hacer inferencia sobre una sola imagen (224x224 con 3 canales de color). Sin embargo, cuando me pase la imagen a mi modelo a través de model(imgs[:, :, :, 2]) Obtengo:

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

Para referencia, imgs[:, :, :, 2] da:

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

Alguna idea de lo que me estoy perdiendo aquí? ¿El modelo requieren las mismas dimensiones durante la inferencia de que fue entrenado en? Hay una manera de comprobar esto para asegurarse de que estoy dando la entrada correcta dimensiones?

Actualización: me di cuenta de que tengo que pasar en el número de imágenes (que en este caso es uno de ellos), así que lo hice:

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

que funciona como se espera. Voy a dejar esta pregunta abierta si alguien tiene una respuesta a las preguntas iniciales acerca de la comprobación de entrada se atenúa.

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

Mejor respuesta

4

Como has descubierto, NNlib.jl (la biblioteca que implementa la convolución de Flujo) espera la entrada para tener el lote dimensión. Si usted está pasando a través de una sola imagen, puedes medir una sola dimensión. Hay varias maneras de lograr esto.

En primer lugar, el problema:

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

De color de una imagen debe ser 4D (ancho por alto por color/profundidad por lote).

Una opción para rellenar un lote dimensión es el uso de un rango para el índice:

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

Otra opción si se le da una sola imagen como una matriz 3D es el uso de 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

Pasamos unsqueeze la dimensión queremos pad como un argumento. En nuestro caso, esta debería ser la última dimensión de x (es decir, el lote dimensión) que se puede conseguir en Julia con ndims(x).

2021-11-22 18:25:51
4

Lo siento, realmente soy un experto, pero no es el problema que imgs[:, :, :, 2] cajas de 3 dimensiones tensor? Puede ser imgs[:, :, :, 2:2] iba a funcionar, ya que hace cuatro dimensiones del tensor con la última dimensión igual a uno (ya que usted tiene una imagen)

2021-11-22 18:23:47
3

Ambas respuestas son correctas, la verdad. Un simple reshape(x, size(x)..., 1) debe hacer el truco demasiado, asumiendo x es la 3 dimensiones de imagen de tensor de que usted consiga en la indización en el lote

2021-11-22 18:41:39

En otros idiomas

Esta página está en otros idiomas

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