【问题标题】:Flux.jl model always outputs 1.0 after adding Sigmoid activation functionFlux.jl 模型在添加 Sigmoid 激活函数后总是输出 1.0
【发布时间】:2021-11-22 20:59:14
【问题描述】:

我最初的问题是我希望我的模型只输出 0-1,这样我就可以映射回我的分类图像标签 (Flux.jl restrict variables between 0 and 1)。所以我决定添加一个sigmoid激活函数如下:

σ = sigmoid

model = Chain(
  resnet[1:end-2],
  Dense(2048, 1000),  
  Dense(1000, 256),
  Dense(256, 2, σ),        # we get 2048 features out, and we have 2 classes
);

但是,现在我的模型只输出 1.0。关于为什么或是否我使用了错误的激活函数有什么想法吗?

【问题讨论】:

标签: julia flux.jl


【解决方案1】:

考虑为隐藏层使用激活函数,因为多个线性层(没有非线性激活函数的密集层)仅相当于单个线性层。如果您使用的类别是排他性的(狗或猫,但不是两者),涵盖了您的所有案例(它将始终是狗或猫,而不是例如鸵鸟),那么概率的总和应为 1,softmax 应该更适合最后一个功能。 softmax 函数一般与crossentropy 一起使用 损失函数。

model = Chain(
  resnet[1:end-2],
  Dense(2048, 1000, σ),  
  Dense(1000, 256, σ),
  Dense(256, 2),
  softmax        
);

为了获得更好的数值稳定性和准确性,建议将crossentropy分别替换为logitcrossentropy(这种情况下不需要softmax)。

【讨论】:

  • 这会报错:MethodError: no method matching similar(::Float32, ::Type{Float32}) Closest candidates are: similar(!Matched::Union{LinearAlgebra.Adjoint{T, var"#s814"}, LinearAlgebra.Transpose{T, var"#s814"}} where {T, var"#s814"<:(AbstractVector{T} where T)}, ::Type{T}) where T at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.6/LinearAlgebra/src/adjtrans.jl
  • @logankilpatrick,确实,我更新了我的回复,将 softmax 放在最后一个 Dense 层之后。现在可以用了吗?
  • 它似乎将值限制在 0 和 1 之间,但不同图像的输出值始终相同
  • @logankilpatrick 你确定 ResNet 模型实际上是经过预训练的吗?文档中提到它没有预先训练 (fluxml.ai/Metalhead.jl/dev/README.html) 如果没有,您需要训练模型的所有参数,并且可能不止 2 个 epoch。作为测试,您还可以使用测试数据运行完整的 ResNet 模型。
  • 这可能是问题所在,让我尝试训练所有层。
猜你喜欢
  • 2021-03-23
  • 2018-04-15
  • 2020-12-05
  • 1970-01-01
  • 2014-01-06
  • 2021-02-05
  • 1970-01-01
  • 2019-10-31
  • 2018-08-14
相关资源
最近更新 更多