es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Red neuronal todas las predicciones son iguales en Julia utilizando Flux.jl

Actualmente estoy desarrollando una red neuronal en Julia utilizando el paquete flux.jl y tengo un problema con mis predicciones. Mis pesos cambian en comparación con lo que solían ser al principio, pero todas mis predicciones en cada elemento de la matriz de fila de -y hat también conocida como predicciones están establecidas en el mismo valor (entre 0 y 1, por ejemplo 0.1245). No importa lo que haga, no puedo encontrar el error en el código de abajo. Sería muy apreciado si alguien estuviera dispuesto a ayudar con esto, gracias de antemano.

Nota: train y test son DataFrames divididos

X_train = copy(train)

X_train = permutedims(Matrix(select!(X_train, Not(:"converted"))), (2,1));

y_train = permutedims(train[:, "converted"]);

X_test = copy(test)

X_test = permutedims(Matrix(select!(X_test, Not(:"converted"))), (2,1));

y_test = permutedims(test[:, "converted"]);

function NeuralNetwork()
    return Chain(
            Dense(19,25,relu),Dense(25,1,relu),
            Dense(1,1,σ)
            )
end

model = NeuralNetwork();

opt = Descent(0.005);

data=Flux.Data.DataLoader((X_train, y_train), batchsize=1)

loss(x, y) = sum(Flux.Losses.binarycrossentropy(model(x), y));

epochs = 3;

ps = Flux.params(model)

for i in 1:epochs
    Flux.train!(loss, ps, data, opt)
end

model(X_test)

Resultado de “model(X_test)”:
1×45000 Matrix{Float32}:
0.139239 0.139239 0.139239 0.139239 … 0.139239 0.139239 0.139239

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en la función de activación utilizada en la última capa de tu red neuronal. Has utilizado σ como la función de activación para la última capa, lo cual da un valor entre 0 y 1. Esto significa que todas las predicciones se están mapeando a este mismo rango de valores.

    Para solucionar esto, puedes cambiar la función de activación de la última capa por algo como identity, que simplemente devolverá la suma ponderada sin ninguna transformación adicional.

    Aquí te mostramos cómo puedes modificar tu función NeuralNetwork para utilizar identity como la función de activación para la última capa:

    function NeuralNetwork()
        return Chain(
                Dense(19,25,relu),
                Dense(25,1,relu),
                Dense(1,1,identity) # utiliza identity como función de activación para la última capa
                )
    end
    

    Esto debería darte un rango de valores para tus predicciones en lugar de que todas sean iguales.

Comments are closed.