我正在编写一个将 Python Keras
(v1.1.0) 模型转换为 JuliaFlux
模型的脚本,并且我正在努力实现正则化(我已阅读https://fluxml.ai/Flux.jl/stable/models/regularisation/)作为一种方式了解朱莉娅。
所以,在Keras
的 json 模型中,我有类似的东西:"W_regularizer": {"l2": 0.0010000000474974513, "name": "WeightRegularizer", "l1": 0.0}
对于每Dense
一层。我想使用这些系数在Flux
模型中创建正则化。问题在于,Flux
它直接添加到损失中,而不是被定义为层本身的属性。
为避免在此处发布太多代码,我已将其添加到 repo 中。这是一个采用 json 和 createa 的小脚本Flux
:Chain
https: //github.com/iegorval/Keras2Flux.jl/blob/master/Keras2Flux/src/Keras2Flux.jl
现在,我想使用预定义的/系数为每Dense
一层创建一个惩罚。我试着这样做:l1
l2
using Pkg
pkg"activate /home/username/.julia/dev/Keras2Flux"
using Flux
using Keras2Flux
using LinearAlgebra
function get_penalty(model::Chain, regs::Array{Any, 1})
index_model = 1
index_regs = 1
penalties = []
for layer in model
if layer isa Dense
println(regs[index_regs](layer.W))
penalty(m) = regs[index_regs](m[index_model].W)
push!(penalties, penalty)
#println(regs[i])
index_regs += 1
end
index_model += 1
end
total_penalty(m) = sum([p(m) for p in penalties])
println(total_penalty)
println(total_penalty(model))
return total_penalty
end
model, regs = convert_keras2flux("examples/keras_1_1_0.json")
penalty = get_penalty(model, regs)
因此,我为每一层创建了一个惩罚函数Dense
,然后将其总结为总惩罚。但是,它给了我这个错误:
ERROR: LoadError: BoundsError: attempt to access 3-element Array{Any,1} at index [4]
我明白这意味着什么,但我真的不明白如何解决它。因此,似乎当我调用 时total_penalty(model)
,它使用index_regs
== 4 (因此, 和 的值index_regs
在index_model
for 循环之后)。相反,我想使用他们的实际指数,同时将给定的惩罚推到惩罚列表中。
另一方面,如果我不是将其作为函数列表而是作为值列表,那也是不正确的,因为我将损失定义为
loss(x, y) = binarycrossentropy(model(x), y) + total_penalty(model)
:如果我只是将它用作值列表,那么我将有一个 static ,而在模型训练期间total_penalty
每次都应该为每一层重新计算它。Dense
如果有 Julia 经验的人给我一些建议,我将不胜感激,因为我肯定无法理解它在 Julia 中的工作原理,特别是在Flux
. 我将如何创建total_penalty
在训练期间自动重新计算的?