簡體   English   中英

通量損失函數未按預期讀取數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM