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
.