大家好, 我有简单地学过一点机器学习, 在做情感分析时出现了问题. 数据都预处理完了, 然而在训练神经网络时老是报错. Flux的文档说的实在是太简略了, model-zoo的模型跟我要做的差别有点大, 数据集也下载不下来, 无法通过数据复现学习. 所以发此贴求助.
报错信息有两个, 一个是ERROR: DimensionMismatch("arrays could not be broadcast to a common size; got a dimension with lengths 10 and 50")
, 另一个是 ERROR: MethodError: no method matching logitcrossentropy(::Array{Float32,2}, ::Bool)
. 第一个我完全不知道哪里错了, 第二个知道哪里错了但不知怎么改. 一会报错这个, 一会儿报错那个.
我是要做一个情感分析问题, x是句向量, 一个句子用50长度的向量表示, y是分类, 有-1,0,1 三类, 数据处理的部分比较长, 我写了个样本, 跟我的数据结构大概相符和, 下面的代码中, 一共有10个样本
using Flux
using Flux:onehotbatch,logitcrossentropy,RNN
x=randn(50,10)
yy=[-1,1,0,1,1,0,0,1,-1,1]
y=onehotbatch(yy,-1:1)
m = Chain(RNN(50, 32), Dense(32, 3),softmax)
loss(x,y) = Flux.logitcrossentropy(m(x), y)
opt = ADAM(0.001)
Flux.train!(loss, params(m), zip(x,y), opt)
这一段短代码运行起来比较快, 如果需要我发出完整代码和数据也可, 我自己写的数据处理效率不高, 跑起来估计比较久.
实际上, 我对RNN几乎不懂, 让我去钻研内部的原理, 实在没那么多时间, 想做RNN纯粹是为了玩玩, 所以发此贴问下论坛里的大佬们, 以达到"API编程"的目的. 提前致谢!
目前的结论, 代码应该如下
using Flux
using Flux:onehotbatch,logitcrossentropy,RNN,update!
x =[randn(50) for i=1:10]
yy=[-1,1,0,1,1,0,0,1,-1,1]
y=Flux.chunk(onehotbatch(yy,-1:1),10)
m =RNN(1, 3)
opt = ADAM(0.001)
function eval_model(x)
out = m.(x)[end]
Flux.reset!(m)
out
end
loss(x, y) = logitcrossentropy(eval_model(x) ,y)
println("Training loss before = ", sum(loss.(x, y)))
evalcb() = @show(sum(loss.(x, y)))
Flux.train!(loss, params(m),zip(x,y), opt, cb = Flux.throttle(evalcb,1))
分享一下自己写的垃圾代码, 注释写的比较详细, 希望对大家有帮助.
https://github.com/Jerrywang959/Julia_study/blob/master/Text_analysis/GRU.jl