Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Interfaces/IGpuOptimizerConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public interface IGpuOptimizerConfig
/// how to apply its own update, so adding new optimizers doesn't require modifying layer code.
/// </para>
/// </remarks>
void ApplyUpdate(IDirectGpuBackend backend, IGpuBuffer param, IGpuBuffer gradient,
void ApplyUpdate(IDirectGpuBackend backend, IGpuBuffer param, IGpuBuffer gradient,
GpuOptimizerState state, int size);
}

Expand Down
12 changes: 6 additions & 6 deletions src/LossFunctions/DiceLoss.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,21 +78,21 @@ public override T CalculateLoss(Vector<T> predicted, Vector<T> actual)
public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> actual)
{
ValidateVectorLengths(predicted, actual);

T intersection = NumOps.Zero;
T sumPredicted = NumOps.Zero;
T sumActual = NumOps.Zero;

for (int i = 0; i < predicted.Length; i++)
{
intersection = NumOps.Add(intersection, NumOps.Multiply(predicted[i], actual[i]));
sumPredicted = NumOps.Add(sumPredicted, predicted[i]);
sumActual = NumOps.Add(sumActual, actual[i]);
}

T denominator = NumOps.Add(sumPredicted, sumActual);
T twoIntersection = NumOps.Multiply(NumOps.FromDouble(2.0), intersection);

var result = new T[predicted.Length];
for (int i = 0; i < predicted.Length; i++)
{
Expand All @@ -109,9 +109,9 @@ public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> act
)
);
}

return new Vector<T>(result);
}


}
16 changes: 8 additions & 8 deletions src/LossFunctions/FocalLoss.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,30 +101,30 @@ public override T CalculateLoss(Vector<T> predicted, Vector<T> actual)
public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> actual)
{
ValidateVectorLengths(predicted, actual);

var result = new T[predicted.Length];

for (int i = 0; i < predicted.Length; i++)
{
T p = NumericalStabilityHelper.ClampProbability(predicted[i], NumericalStabilityHelper.SmallEpsilon);
T y = actual[i];

T pt = NumOps.Equals(y, NumOps.One) ? p : NumOps.Subtract(NumOps.One, p);
T alphaT = NumOps.Equals(y, NumOps.One) ? _alpha : NumOps.Subtract(NumOps.One, _alpha);

T focusingTerm = NumOps.Power(NumOps.Subtract(NumOps.One, pt), _gamma);
T logPt = NumericalStabilityHelper.SafeLog(pt, NumericalStabilityHelper.SmallEpsilon);

// Derivative of focal loss with respect to p
T gammaFactor = NumOps.Multiply(_gamma, NumOps.Power(NumOps.Subtract(NumOps.One, pt), NumOps.Subtract(_gamma, NumOps.One)));
T term1 = NumOps.Multiply(gammaFactor, logPt);
T term2 = NumOps.Divide(focusingTerm, pt);

T grad = NumOps.Multiply(alphaT, NumOps.Subtract(term1, term2));

result[i] = NumOps.Equals(y, NumOps.One) ? grad : NumOps.Negate(grad);
}

return new Vector<T>(result).Divide(NumOps.FromDouble(predicted.Length));
}

Expand Down
8 changes: 4 additions & 4 deletions src/LossFunctions/HingeLoss.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,13 +62,13 @@ public override T CalculateLoss(Vector<T> predicted, Vector<T> actual)
public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> actual)
{
ValidateVectorLengths(predicted, actual);

var result = new T[predicted.Length];

for (int i = 0; i < predicted.Length; i++)
{
T margin = NumOps.Subtract(NumOps.One, NumOps.Multiply(actual[i], predicted[i]));

if (NumOps.GreaterThan(margin, NumOps.Zero))
{
// Derivative is -y when margin > 0
Expand All @@ -80,7 +80,7 @@ public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> act
result[i] = NumOps.Zero;
}
}

return new Vector<T>(result).Divide(NumOps.FromDouble(predicted.Length));
}

Expand Down
8 changes: 4 additions & 4 deletions src/LossFunctions/HuberLoss.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,14 +92,14 @@ public override T CalculateLoss(Vector<T> predicted, Vector<T> actual)
public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> actual)
{
ValidateVectorLengths(predicted, actual);

var result = new T[predicted.Length];

for (int i = 0; i < predicted.Length; i++)
{
T diff = NumOps.Subtract(predicted[i], actual[i]);
T absDiff = NumOps.Abs(diff);

if (NumOps.LessThanOrEquals(absDiff, _delta))
{
// Quadratic region: derivative is diff
Expand All @@ -111,7 +111,7 @@ public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> act
result[i] = NumOps.Multiply(_delta, NumOps.SignOrZero(diff));
}
}

return new Vector<T>(result).Divide(NumOps.FromDouble(predicted.Length));
}

Expand Down
6 changes: 3 additions & 3 deletions src/LossFunctions/LogCoshLoss.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,9 @@ public override T CalculateLoss(Vector<T> predicted, Vector<T> actual)
public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> actual)
{
ValidateVectorLengths(predicted, actual);

var result = new T[predicted.Length];

for (int i = 0; i < predicted.Length; i++)
{
T diff = NumOps.Subtract(predicted[i], actual[i]);
Expand All @@ -91,7 +91,7 @@ public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> act
NumOps.Add(expPos, expNeg)
);
}

return new Vector<T>(result).Divide(NumOps.FromDouble(predicted.Length));
}

Expand Down
8 changes: 4 additions & 4 deletions src/LossFunctions/LossFunctionBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,17 +54,17 @@ public virtual (T Loss, IGpuTensor<T> Gradient) CalculateLossAndGradientGpu(IGpu
// Default: fall back to CPU
var predictedCpu = predicted.ToTensor();
var actualCpu = actual.ToTensor();

var loss = CalculateLoss(predictedCpu.ToVector(), actualCpu.ToVector());
var gradientCpu = CalculateDerivative(predictedCpu.ToVector(), actualCpu.ToVector());

var gradientTensor = new Tensor<T>(predictedCpu.Shape);
Array.Copy(gradientCpu.ToArray(), gradientTensor.Data, gradientCpu.Length);

var engine = AiDotNetEngine.Current as DirectGpuTensorEngine;
var backend = engine?.GetBackend() ?? throw new InvalidOperationException("GPU backend not available");
var gradientGpu = new GpuTensor<T>(backend, gradientTensor, GpuTensorRole.Gradient);

return (loss, gradientGpu);
}

Expand Down
8 changes: 4 additions & 4 deletions src/LossFunctions/QuantileLoss.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,13 @@ public override T CalculateLoss(Vector<T> predicted, Vector<T> actual)
public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> actual)
{
ValidateVectorLengths(predicted, actual);

var result = new T[predicted.Length];

for (int i = 0; i < predicted.Length; i++)
{
T diff = NumOps.Subtract(actual[i], predicted[i]);

if (NumOps.GreaterThan(diff, NumOps.Zero))
{
// Underestimation: derivative is -quantile
Expand All @@ -108,7 +108,7 @@ public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> act
result[i] = NumOps.Subtract(NumOps.One, _quantile);
}
}

return new Vector<T>(result).Divide(NumOps.FromDouble(predicted.Length));
}

Expand Down
8 changes: 4 additions & 4 deletions src/LossFunctions/RootMeanSquaredErrorLoss.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,22 +42,22 @@ public override T CalculateLoss(Vector<T> predicted, Vector<T> actual)
public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> actual)
{
ValidateVectorLengths(predicted, actual);

var diff = predicted - actual;
var mse = diff.PointwiseMultiply(diff).Average();
var rmse = NumOps.Sqrt(mse);

if (NumOps.Equals(rmse, NumOps.Zero))
{
var zeros = new T[predicted.Length];
for (int i = 0; i < zeros.Length; i++)
zeros[i] = NumOps.Zero;
return new Vector<T>(zeros);
}

var n = NumOps.FromDouble(predicted.Length);
return diff.Divide(NumOps.Multiply(rmse, n));
}


}
8 changes: 4 additions & 4 deletions src/LossFunctions/SquaredHingeLoss.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,13 @@ public override T CalculateLoss(Vector<T> predicted, Vector<T> actual)
public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> actual)
{
ValidateVectorLengths(predicted, actual);

var result = new T[predicted.Length];

for (int i = 0; i < predicted.Length; i++)
{
T margin = NumOps.Subtract(NumOps.One, NumOps.Multiply(actual[i], predicted[i]));

if (NumOps.GreaterThan(margin, NumOps.Zero))
{
// Derivative is -2 * margin * y when margin > 0
Expand All @@ -89,7 +89,7 @@ public override Vector<T> CalculateDerivative(Vector<T> predicted, Vector<T> act
result[i] = NumOps.Zero;
}
}

return new Vector<T>(result).Divide(NumOps.FromDouble(predicted.Length));
}

Expand Down
8 changes: 4 additions & 4 deletions src/NeuralNetworks/BigGAN.cs
Original file line number Diff line number Diff line change
Expand Up @@ -998,17 +998,17 @@ public Vector<TLoss> CalculateDerivative(Vector<TLoss> predicted, Vector<TLoss>
// Fall back to CPU for now
var predictedCpu = predicted.ToTensor();
var actualCpu = actual.ToTensor();

var loss = CalculateLoss(predictedCpu.ToVector(), actualCpu.ToVector());
var gradientCpu = CalculateDerivative(predictedCpu.ToVector(), actualCpu.ToVector());

var gradientTensor = new Tensor<TLoss>(predictedCpu.Shape);
Array.Copy(gradientCpu.ToArray(), gradientTensor.Data, gradientCpu.Length);

var engine = AiDotNetEngine.Current as DirectGpuTensorEngine;
var backend = engine?.GetBackend() ?? throw new InvalidOperationException("GPU backend not available");
var gradientGpu = new GpuTensor<TLoss>(backend, gradientTensor, GpuTensorRole.Gradient);

return (loss, gradientGpu);
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/NeuralNetworks/NeuralNetworkBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -797,7 +797,7 @@ public virtual T TrainBatchGpuDeferred(
};

T lossValue = NumOps.Zero;

var backend = gpuEngine.GetBackend() as IAsyncGpuBackend;
if (backend == null)
{
Expand Down Expand Up @@ -861,7 +861,7 @@ public virtual async Task<T> TrainBatchGpuDeferredAsync(
};

T lossValue = NumOps.Zero;

var backend = gpuEngine.GetBackend() as IAsyncGpuBackend;
if (backend == null)
{
Expand Down
8 changes: 4 additions & 4 deletions src/NeuralNetworks/SAGAN.cs
Original file line number Diff line number Diff line change
Expand Up @@ -683,17 +683,17 @@ public Vector<TLoss> CalculateDerivative(Vector<TLoss> predicted, Vector<TLoss>
// Fall back to CPU for now
var predictedCpu = predicted.ToTensor();
var actualCpu = actual.ToTensor();

var loss = CalculateLoss(predictedCpu.ToVector(), actualCpu.ToVector());
var gradientCpu = CalculateDerivative(predictedCpu.ToVector(), actualCpu.ToVector());

var gradientTensor = new Tensor<TLoss>(predictedCpu.Shape);
Array.Copy(gradientCpu.ToArray(), gradientTensor.Data, gradientCpu.Length);

var engine = AiDotNetEngine.Current as DirectGpuTensorEngine;
var backend = engine?.GetBackend() ?? throw new InvalidOperationException("GPU backend not available");
var gradientGpu = new GpuTensor<TLoss>(backend, gradientTensor, GpuTensorRole.Gradient);

return (loss, gradientGpu);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/Optimizers/AMSGradOptimizer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Newtonsoft.Json;
using AiDotNet.Tensors.Engines.DirectGpu;
using Newtonsoft.Json;

namespace AiDotNet.Optimizers;

Expand Down
2 changes: 1 addition & 1 deletion src/Optimizers/AdaDeltaOptimizer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Newtonsoft.Json;
using AiDotNet.Tensors.Engines.DirectGpu;
using Newtonsoft.Json;

namespace AiDotNet.Optimizers;

Expand Down
2 changes: 1 addition & 1 deletion src/Optimizers/AdaMaxOptimizer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Newtonsoft.Json;
using AiDotNet.Tensors.Engines.DirectGpu;
using Newtonsoft.Json;

namespace AiDotNet.Optimizers;

Expand Down
2 changes: 1 addition & 1 deletion src/Optimizers/AdagradOptimizer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Newtonsoft.Json;
using AiDotNet.Tensors.Engines.DirectGpu;
using Newtonsoft.Json;

namespace AiDotNet.Optimizers;

Expand Down
2 changes: 1 addition & 1 deletion src/Optimizers/AdamOptimizer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Newtonsoft.Json;
using AiDotNet.Tensors.Engines.DirectGpu;
using Newtonsoft.Json;

namespace AiDotNet.Optimizers;

Expand Down
2 changes: 1 addition & 1 deletion src/Optimizers/AdamWOptimizer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Newtonsoft.Json;
using AiDotNet.Tensors.Engines.DirectGpu;
using Newtonsoft.Json;

namespace AiDotNet.Optimizers;

Expand Down
2 changes: 1 addition & 1 deletion src/Optimizers/FTRLOptimizer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Newtonsoft.Json;
using AiDotNet.Tensors.Engines.DirectGpu;
using Newtonsoft.Json;

namespace AiDotNet.Optimizers;

Expand Down
2 changes: 1 addition & 1 deletion src/Optimizers/GradientDescentOptimizer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Newtonsoft.Json;
using AiDotNet.Tensors.Engines.DirectGpu;
using Newtonsoft.Json;

namespace AiDotNet.Optimizers;

Expand Down
2 changes: 1 addition & 1 deletion src/Optimizers/LAMBOptimizer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Newtonsoft.Json;
using AiDotNet.Tensors.Engines.DirectGpu;
using Newtonsoft.Json;

namespace AiDotNet.Optimizers;

Expand Down
2 changes: 1 addition & 1 deletion src/Optimizers/LARSOptimizer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Newtonsoft.Json;
using AiDotNet.Tensors.Engines.DirectGpu;
using Newtonsoft.Json;

namespace AiDotNet.Optimizers;

Expand Down
2 changes: 1 addition & 1 deletion src/Optimizers/LionOptimizer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Newtonsoft.Json;
using AiDotNet.Tensors.Engines.DirectGpu;
using Newtonsoft.Json;

namespace AiDotNet.Optimizers;

Expand Down
Loading