2

这可能是我的一个非常简单的错误,但我似乎无法弄清楚。我正在尝试构建一个可以学习数字序列的 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:没有方法匹配损失((序列长度)*: :Float64)”。

在我正在处理的示例中,这不是问题。我可以从头开始构建训练程序,但宁愿将东西传递给 Flux。

4

1 回答 1

1

这是数据形状的问题: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)
于 2020-01-27T11:26:32.740 回答