Flux中setup未定义错误:求优化器新定义方式及版本变更
Flux优化器定义问题解答
问题背景
使用环境:Julia v1.9.0、Flux v0.12.10
运行代码:
hparams = HyperParams() gen = generator() enc = encoder() dec = decoder() gen_opt = Flux.setup(Flux.Adam(hparams.lr_gen), gen) enc_opt = Flux.setup(Flux.Adam(hparams.lr_enc), enc) dec_opt = Flux.setup(Flux.Adam(hparams.lr_dec), dec) losses_gen = [] losses_dscr = [] train_steps = 0 # Training loop gen_ps = Flux.params(gen) enc_ps = Flux.params(enc) dec_ps = Flux.params(dec) ...
报错信息:
ERROR: UndefVarError: `setup` not defined Stacktrace: [1] getproperty(xWARNING: both Losses and NNlib export "ctc_loss"; uses of it in module Flux must be qualified ::Module, f::Symbol) @ Base ./Base.jl:31 [2] top-level scope @ ~/github/AdaptativeBlockLearning/examples/MMD_GAN/mmd_gan_1d.jl:65
问题:Flux中定义优化器的新方式是什么,该变更出现在哪个版本?
问题原因与解决方案
原因
Flux.setup是Flux v0.13.0及以后版本引入的全新优化器配置API,你当前使用的v0.12.10属于旧版本,尚未包含这个函数,因此触发UndefVarError。
两种处理方式
1. 继续使用Flux v0.12.10(旧版本)
旧版本无需setup函数,直接初始化优化器实例即可,配合Flux.train!或Flux.update!完成参数更新:
# 旧版本优化器定义写法 gen_opt = Flux.Adam(hparams.lr_gen) enc_opt = Flux.Adam(hparams.lr_enc) dec_opt = Flux.Adam(hparams.lr_dec) # 训练时示例(用Flux.train!) Flux.train!(your_loss_function, gen_ps, training_data, gen_opt)
你代码中用Flux.params(model)获取参数的方式在旧版本中是完全正确的,可继续使用。
2. 升级到Flux v0.13.0+(新版本)
新版本的标准流程就是使用Flux.setup创建绑定了模型参数的优化器状态,再通过Flux.update!完成参数更新,无需手动调用Flux.params:
# 新版本优化器定义写法 gen_opt = Flux.setup(Flux.Adam(hparams.lr_gen), gen) enc_opt = Flux.setup(Flux.Adam(hparams.lr_enc), enc) dec_opt = Flux.setup(Flux.Adam(hparams.lr_dec), dec) # 训练时参数更新示例 grads = Flux.gradient(() -> your_loss_function(gen, enc, dec), Flux.params(gen, enc, dec)) Flux.update!(gen_opt, gen, grads[gen]) Flux.update!(enc_opt, enc, grads[enc]) Flux.update!(dec_opt, dec, grads[dec])
新版本中Flux.params仍可使用,但推荐直接传递模型给update!,代码更简洁直观。
内容的提问来源于stack exchange,提问作者Jose Manuel de Frutos
相关产品推荐
相关产品推荐

