Updated loss functions

This commit is contained in:
Adarsh Kumar 2020-03-03 16:02:57 +05:30 committed by GitHub
parent 92e09e204d
commit 6e5c18bddf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 21 additions and 30 deletions

View File

@ -16,33 +16,33 @@ mse(ŷ, y) = sum((ŷ .- y).^2) * 1 // length(y)
""" """
msle(, y; ϵ = eps.(Float64.())) msle(, y; ϵ=eps(eltype()))
Returns the mean of the squared logarithmic errors `sum((log.(ŷ + ϵ) .- log.(y + ϵ)).^2) / length(y)`. Returns the mean of the squared logarithmic errors `sum((log.(ŷ .+ ϵ) .- log.(y .+ ϵ)).^2) / length(y)`.
The `ϵ` term provides numerical stability. The `ϵ` term provides numerical stability.
This error penalizes an under-predicted estimate greater than an over-predicted estimate. This error penalizes an under-predicted estimate greater than an over-predicted estimate.
""" """
msle(, y; ϵ = eps.()) = sum((log.( + ϵ).-log.(y + ϵ)).^2) * 1 // length(y) msle(, y; ϵ=eps(eltype())) = sum((log.( .+ ϵ) .- log.(y .+ ϵ)).^2) * 1 // length(y)
""" """
huber_loss(, y; delta = 1.0) huber_loss(, y; δ=1.0)
Computes the mean of the Huber loss given the prediction `` and true values `y`. By default, delta is set to 1.0. Computes the mean of the Huber loss given the prediction `` and true values `y`. By default, δ is set to 1.0.
| 0.5*| - y|, for | - y| <= delta | 0.5*| - y|, for | - y| <= δ
Hubber loss = | Hubber loss = |
| delta*(|- y| - 0.5*delta), otherwise | δ*(| - y| - 0.5*δ), otherwise
[`Huber Loss`](https://en.wikipedia.org/wiki/Huber_loss). [`Huber Loss`](https://en.wikipedia.org/wiki/Huber_loss).
""" """
function huber_loss(, y; delta = eltype()(1)) function huber_loss(, y; δ=eltype()(1))
abs_error = abs.(.-y) abs_error = abs.( .- y)
temp = abs_error.<delta temp = abs_error .< δ
x = eltype()(0.5) x = eltype()(0.5)
hub_loss = sum(((abs_error.^2).*temp).*x .+ delta*(abs_error.- x*delta).*(1 .-temp)) * 1 // length(y) hub_loss = sum(((abs_error.^2) .* temp) .* x .+ δ*(abs_error .- x*δ) .* (1 .- temp)) * 1 // length(y)
end end
function _crossentropy(::AbstractVecOrMat, y::AbstractVecOrMat, weight::Nothing) function _crossentropy(::AbstractVecOrMat, y::AbstractVecOrMat, weight::Nothing)
@ -144,7 +144,7 @@ It is always non-negative and zero only when both the distributions are equal ev
[KL Divergence](https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence). [KL Divergence](https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence).
""" """
function kldivergence(, y) function kldivergence(, y)
entropy = sum(y .* log.(y)) *1 //size(y,2) entropy = sum(y .* log.(y)) * 1 //size(y,2)
cross_entropy = crossentropy(, y) cross_entropy = crossentropy(, y)
return entropy + cross_entropy return entropy + cross_entropy
end end
@ -157,7 +157,7 @@ Returns `sum(ŷ .- y .* log.(ŷ)) / size(y, 2)`
[Poisson Loss](https://peltarion.com/knowledge-center/documentation/modeling-view/build-an-ai-model/loss-functions/poisson). [Poisson Loss](https://peltarion.com/knowledge-center/documentation/modeling-view/build-an-ai-model/loss-functions/poisson).
""" """
poisson(, y) = sum( .- y .* log.()) *1 // size(y,2) poisson(, y) = sum( .- y .* log.()) * 1 // size(y,2)
""" """
hinge(, y) hinge(, y)
@ -168,7 +168,7 @@ Returns `sum((max.(0, 1 .- ŷ .* y))) / size(y, 2)`
[Hinge Loss](https://en.wikipedia.org/wiki/Hinge_loss) [Hinge Loss](https://en.wikipedia.org/wiki/Hinge_loss)
See also [`squared_hinge`](@ref). See also [`squared_hinge`](@ref).
""" """
hinge(, y) = sum(max.(0, 1 .- .* y)) *1 // size(y, 2) hinge(, y) = sum(max.(0, 1 .- .* y)) * 1 // size(y, 2)
""" """
squared_hinge(, y) squared_hinge(, y)
@ -178,34 +178,25 @@ Returns `sum((max.(0, 1 .- ŷ .* y)).^2) / size(y, 2)`
See also [`hinge`](@ref). See also [`hinge`](@ref).
""" """
squared_hinge(, y) = sum((max.(0, 1 .- .* y)).^2) *1 // size(y, 2) squared_hinge(, y) = sum((max.(0, 1 .- .* y)).^2) * 1 // size(y, 2)
""" """
dice_coeff_loss(, y, smooth = 1) dice_coeff_loss(, y; smooth=1)
Loss function used in Image Segmentation. Calculates loss based on dice coefficient. Similar to F1_score. Loss function used in Image Segmentation. Calculates loss based on dice coefficient. Similar to F1_score.
Returns `1 - 2*sum(|ŷ .* y| + smooth) / (sum(ŷ.^2) + sum(y.^2) + smooth)`
Dice_Coefficient(, y) = 2 * sum( |.* y| + smooth) / (sum( .^2 ) + sum( y.^2 ) + smooth)
Dice_loss = 1 - Dice_Coefficient
[V-Net: Fully Convolutional Neural Networks forVolumetric Medical Image Segmentation](https://arxiv.org/pdf/1606.04797v1.pdf) [V-Net: Fully Convolutional Neural Networks forVolumetric Medical Image Segmentation](https://arxiv.org/pdf/1606.04797v1.pdf)
""" """
function dice_coeff_loss(, y; smooth = eltype()(1.0)) dice_coeff_loss(, y; smooth=eltype()(1.0)) = 1 - (2*sum(y .* ) + smooth) / (sum(y.^2) + sum(.^2) + smooth)
intersection = sum(y.*)
return 1 - (2*intersection + smooth) / (sum(y.^2) + sum(.^2) + smooth)
end
""" """
tversky_loss(, y, β = 0.7) tversky_loss(, y; β=0.7)
Used with imbalanced data to give more weightage to False negatives. Used with imbalanced data to give more weightage to False negatives.
Larger β weigh recall higher than precision (by placing more emphasis on false negatives) Larger β weigh recall higher than precision (by placing more emphasis on false negatives)
Returns `1 - sum(|y .* ŷ| + 1) / (sum(y .* ŷ + β*(1 .- y) .* ŷ + (1 - β)*y .* (1 .- ŷ)) + 1)`
tversky_loss(, y, β) = 1 - sum(|y.*| + 1) / (sum(y.* + β *(1 .- y).* + (1 - β).*y.*(1 .- ))+ 1)
[Tversky loss function for image segmentation using 3D fully convolutional deep networks](https://arxiv.org/pdf/1706.05721.pdf) [Tversky loss function for image segmentation using 3D fully convolutional deep networks](https://arxiv.org/pdf/1706.05721.pdf)
""" """
function tversky_loss(, y; β = eltype()(0.7)) tversky_loss(, y; β=eltype()(0.7)) = 1 - (sum(y .* ) + 1) / (sum(y .* + β*(1 .- y) .* + (1 - β)*y .* (1 .- )) + 1)
intersection = sum(y.*)
return 1 - (intersection + 1) / (sum(y.* + β *(1 .- y).* + (1 - β).*y.*(1 .- )) + 1)
end