[英]Flux Loss function not reading data as expected
這對我來說可能是一個非常簡單的錯誤,但我似乎無法弄清楚。 我正在嘗試構建一個可以學習數字序列的 RNN。 示例數據集(每行代表一個數據點)
0 0 0 1 3
0 0 0 0 0
0 0 1 3 0
...
我主要關注這個例子: https : //www.juliabloggers.com/a-basic-rnn/
我的數據和示例中的數據讀取為 Array{Array{Float64,1},1}。 這是我的一些代碼
function eval_model(model, x)
out = model.(x)[end]
Flux.reset!(model)
return out
end
m = Chain(GRU(1, 40), Dense(40, 1, σ))
loss(y) = Flux.crossentropy(eval_model(m, y), y)
ps = Flux.params(m)
opt = Flux.ADAM()
@epochs 100 Flux.train!(loss, ps, data, opt)
輸出:
MethodError: no method matching loss(::Float64, ::Float64, ::Float64, ::Float64, ::Float64)
Closest candidates are:
loss(::Any, ::Any) at In[4]:2
損失函數讀取序列中的每個數字作為損失函數的單獨輸入(我嘗試過其他序列長度,錯誤是相同的,但它是“MethodError: no method matching loss((length of sequence) * : :Float64)”。
在我正在處理的示例中,這不是問題。 我可以從頭開始構建訓練程序,但寧願將事情傳遞給 Flux。
這是數據形狀的問題: train!
假設您將數據拆分為預測變量和目標以應用於loss(x,y)
。 但在你的情況下train!
將數據拆分為不受歡迎的內容。
data = zip(x,y)
將允許train!
將數據拆分為 x 和 y 數據集中。
此外,您的數據集和損失函數僅采用 y,這使我對您要預測的內容不明確。 如果你想預測序列中的下一項,那么 x 應該省略序列中的最后一個元素,y 跳過序列的第一個元素。
考慮這個例子來預測序列中的下一個元素:
x = data[:,1:end-1]
y = data[:,2:end]
loss(x,y) = Flux.crossentropy(eval_model(m, x), y)
@epochs 100 Flux.train!(loss, ps, zip(x,y), opt)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.