Julia MethodError: нет сопоставления метода (::Dense{typeof(logistic),CuArray{Float32,2,Nothing},CuArray{Float32,1,Nothing}})(::Float32)

У меня есть следующие данные обучения в CuArrays.

X: 300×8544 CuArray{Float32,2,Nothing}
y: 5×8544 Flux.OneHotMatrix{CuArray{Flux.OneHotVector,1,Nothing}}

и у меня есть следующая модель, которую я хочу тренировать:

# define activation
logistic(x) = 1. / (1 .+ exp.(-x))

# first define a 2-layer MLP model
model = Chain(Dense(300, 64, logistic),
          Dense(64, c),
          softmax) |> gpu

# define the loss
loss(x, y) = Flux.crossentropy(model(x), y)

# define the optimiser
optimiser = ADAM()

но если я сделаю

Flux.train!(loss, params(model), zip(X, y), optimiser)

Я получаю следующую ошибку:

MethodError: no method matching (::Dense{typeof(logistic),CuArray{Float32,2,Nothing},CuArray{Float32,1,Nothing}})(::Float32)

Как мне решить эту проблему?

1 ответ

@D.Danier Пожалуйста, предоставьте минимальные рабочие примеры (MWE), то есть полный код, который люди могут копировать, вставлять и запускать. Ниже приведен пример

#Pkg.activate("c:/scratch/flux-test")

using CuArrays, Flux
CuArrays.allowscalar(false)

# define activation
# you don't the broadcast dots
logistic(x) = 1 / (1 + exp(-x))

# ensure your code works on GPU
CuArrays.@cufunc logistic(x) = 1 / (1 + exp(-x))

X = cu(rand(300, 8544))
y = cu(rand(5, 8544))
c = 5

# first define a 2-layer MLP model
model = Chain(Dense(300, 64, logistic),
          Dense(64, c),
          softmax) |> gpu

# define the loss
loss(x, y) = Flux.crossentropy(model(x), y) |> gpu

model(X)

# define the optimiser
optimiser = ADAM()

loss(X, y)

Flux.train!(loss, params(model), zip(eachcol(X), eachcol(y)), optimiser)

Когда ты Flux.train!ты должен сказать Flux что вы хотите объединить столбцы X а также yчтобы вычислить убыток. Кстати, это, вероятно, далеко не идеально, так как вычисляется слишком много итераций. Вы можете сгруппировать их в мини-партии. Или, если ваша проблема действительно такая маленькая, вы можете рассчитать все за один раз, например

Flux.train!(loss, params(model), (X, y), optimiser)

которые в основном говорят о вычислении потерь на основе всего X а также y.

Другие вопросы по тегам