Skip to content

Commit 46d2b64

Browse files
committed
Added input parameter in backward method
1 parent 0f42c29 commit 46d2b64

File tree

11 files changed

+32
-41
lines changed

11 files changed

+32
-41
lines changed

NeuralNetwork.NET/Networks/Implementations/NeuralNetwork.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ internal unsafe void Backpropagate(in TrainingBatch batch, float dropout, [NotNu
252252
* Perform the sigmoid prime of z(l), the activity on the previous layer
253253
* Multiply the previous delta with the transposed weights of the following layer
254254
* Compute d(l), the Hadamard product of z'(l) and delta(l + 1) * W(l + 1)T */
255-
_Layers[l + 1].Backpropagate(*deltas[l + 1], zList[l], _Layers[l].ActivationFunctions.ActivationPrime);
255+
_Layers[l + 1].Backpropagate(aList[l], *deltas[l + 1], zList[l], _Layers[l].ActivationFunctions.ActivationPrime);
256256
if (!dropoutMasks[l].IsNull) CpuBlas.MultiplyElementwise(zList[l], dropoutMasks[l], zList[l]);
257257
deltas[l] = zList + l;
258258
}

NeuralNetwork.NET/Networks/Layers/Abstract/NetworkLayerBase.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,11 @@ protected NetworkLayerBase(in TensorInfo input, in TensorInfo output, Activation
7575
/// <summary>
7676
/// Backpropagates the error to compute the delta for the inputs of the layer
7777
/// </summary>
78+
/// <param name="x">The input <see cref="Tensor"/> used in the forward pass</param>
7879
/// <param name="dy">The output error delta</param>
7980
/// <param name="z">The activity on the inputs of the layer. It will be modified to become the computed delta</param>
8081
/// <param name="activationPrime">The activation prime function performed by the previous layer</param>
81-
public abstract void Backpropagate(in Tensor dy, in Tensor z, ActivationFunction activationPrime);
82+
public abstract void Backpropagate(in Tensor x, in Tensor dy, in Tensor z, ActivationFunction activationPrime);
8283

8384
#region Equality check
8485

NeuralNetwork.NET/Networks/Layers/Cpu/ConvolutionalLayer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public override unsafe void Forward(in Tensor x, out Tensor z, out Tensor a)
9494
}
9595

9696
/// <inheritdoc/>
97-
public override unsafe void Backpropagate(in Tensor dy, in Tensor z, ActivationFunction activationPrime)
97+
public override unsafe void Backpropagate(in Tensor x, in Tensor dy, in Tensor z, ActivationFunction activationPrime)
9898
{
9999
fixed (float* pw = Weights)
100100
{

NeuralNetwork.NET/Networks/Layers/Cpu/FullyConnectedLayer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public override unsafe void Forward(in Tensor x, out Tensor z, out Tensor a)
4848
}
4949

5050
/// <inheritdoc/>
51-
public override unsafe void Backpropagate(in Tensor dy, in Tensor z, ActivationFunction activationPrime)
51+
public override unsafe void Backpropagate(in Tensor x, in Tensor dy, in Tensor z, ActivationFunction activationPrime)
5252
{
5353
fixed (float* pw = Weights)
5454
{

NeuralNetwork.NET/Networks/Layers/Cpu/PoolingLayer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public override void Forward(in Tensor x, out Tensor z, out Tensor a)
4848
}
4949

5050
/// <inheritdoc/>
51-
public override void Backpropagate(in Tensor dy, in Tensor z, ActivationFunction activationPrime) => CpuDnn.PoolingBackward(z, InputInfo, dy, z);
51+
public override void Backpropagate(in Tensor x, in Tensor dy, in Tensor z, ActivationFunction activationPrime) => CpuDnn.PoolingBackward(x, InputInfo, dy, z);
5252

5353
/// <inheritdoc/>
5454
public override INetworkLayer Clone() => new PoolingLayer(InputInfo, OperationInfo, ActivationFunctionType);

NeuralNetwork.NET/Networks/Layers/Cuda/CuDnnConvolutionalLayer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public override void Forward(in Tensor x, out Tensor z, out Tensor a)
108108
}
109109

110110
/// <inheritdoc/>
111-
public override void Backpropagate(in Tensor dy, in Tensor z, ActivationFunction activationPrime)
111+
public override void Backpropagate(in Tensor x, in Tensor dy, in Tensor z, ActivationFunction activationPrime)
112112
{
113113
using (DeviceMemory<float> delta_gpu = DnnInstance.Gpu.AllocateDevice<float>(z.Size))
114114
{

NeuralNetwork.NET/Networks/Layers/Cuda/CuDnnFullyConnectedLayer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public override void Forward(in Tensor x, out Tensor z, out Tensor a)
4646
}
4747

4848
/// <inheritdoc/>
49-
public override void Backpropagate(in Tensor dy, in Tensor z, ActivationFunction activationPrime)
49+
public override void Backpropagate(in Tensor x, in Tensor dy, in Tensor z, ActivationFunction activationPrime)
5050
{
5151
using (DeviceMemory<float>
5252
delta_1_gpu = DnnInstance.Gpu.AllocateDevice(dy),

NeuralNetwork.NET/Networks/Layers/Cuda/CuDnnInceptionLayer.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,6 @@ private int Secondary1x1Weights
8282
get => InputInfo.Channels * OperationInfo.Secondary1x1AfterPoolingConvolutionKernels;
8383
}
8484

85-
// A copy of the forward layer inputs
86-
private Tensor _Inputs;
87-
8885
// 3x3 reduction 1x1 convolution activity
8986
private Tensor _3x3Reduce1x1Z;
9087

@@ -300,8 +297,6 @@ internal CuDnnInceptionLayer(in TensorInfo input, in InceptionInfo info, [NotNul
300297
/// <inheritdoc/>
301298
public override void Forward(in Tensor x, out Tensor z, out Tensor a)
302299
{
303-
_Inputs.TryFree();
304-
x.Duplicate(out _Inputs);
305300
Tensor.New(x.Entities, OutputInfo.Size, out z);
306301
Tensor.New(x.Entities, OutputInfo.Size, out a);
307302
using (DeviceMemory<float>
@@ -443,7 +438,7 @@ public override void Forward(in Tensor x, out Tensor z, out Tensor a)
443438
}
444439

445440
/// <inheritdoc/>
446-
public override void Backpropagate(in Tensor dy, in Tensor z, ActivationFunction activationPrime)
441+
public override void Backpropagate(in Tensor x, in Tensor dy, in Tensor z, ActivationFunction activationPrime)
447442
{
448443
using (DeviceMemory<float>
449444
dx_gpu = DnnInstance.Gpu.AllocateDevice<float>(z.Size),
@@ -534,7 +529,7 @@ public override void Backpropagate(in Tensor dy, in Tensor z, ActivationFunction
534529

535530
// Pooling backward
536531
using (DeviceMemory<float>
537-
x_gpu = DnnInstance.Gpu.AllocateDevice(_Inputs),
532+
x_gpu = DnnInstance.Gpu.AllocateDevice(x),
538533
poolZ_gpu = DnnInstance.Gpu.AllocateDevice(_PoolingZ))
539534
{
540535
DnnInstance.PoolingBackward(PoolingDescription, 1, PoolingOutputDescription, poolZ_gpu.Ptr, PoolingOutputDescription, pooldy_gpu.Ptr, InputDescription, x_gpu.Ptr, 1, InputDescription, dx_gpu.Ptr); // TODO: finish pooling backward
@@ -733,7 +728,6 @@ void IDisposable.Dispose()
733728
// Private Dispose method
734729
private void Dispose()
735730
{
736-
_Inputs.TryFree();
737731
_3x3Reduce1x1Z.TryFree();
738732
_3x3Reduce1x1A.TryFree();
739733
_3x3Reduce1x1Delta.TryFree();

NeuralNetwork.NET/Networks/Layers/Cuda/CuDnnPoolingLayer.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,6 @@ internal sealed class CuDnnPoolingLayer : PoolingLayer, IDisposable
4343

4444
#region Fields
4545

46-
// A copy of the layer inputs
47-
private Tensor _X;
48-
4946
// A copy of the layer output activity
5047
private Tensor _Z;
5148

@@ -59,8 +56,6 @@ public CuDnnPoolingLayer(in TensorInfo input, in PoolingInfo operation, Activati
5956
/// <inheritdoc/>
6057
public override void Forward(in Tensor x, out Tensor z, out Tensor a)
6158
{
62-
_X.TryFree();
63-
x.Duplicate(out _X);
6459
using (DeviceMemory<float>
6560
x_gpu = DnnInstance.Gpu.AllocateDevice(x),
6661
z_gpu = DnnInstance.Gpu.AllocateDevice<float>(x.Entities * OutputInfo.Size))
@@ -80,12 +75,12 @@ public override void Forward(in Tensor x, out Tensor z, out Tensor a)
8075
}
8176

8277
/// <inheritdoc/>
83-
public override void Backpropagate(in Tensor dy, in Tensor z, ActivationFunction activationPrime)
78+
public override void Backpropagate(in Tensor x, in Tensor dy, in Tensor z, ActivationFunction activationPrime)
8479
{
8580
using (DeviceMemory<float> dx_gpu = DnnInstance.Gpu.AllocateDevice<float>(z.Size))
8681
{
8782
using (DeviceMemory<float>
88-
x_gpu = DnnInstance.Gpu.AllocateDevice(_X),
83+
x_gpu = DnnInstance.Gpu.AllocateDevice(x),
8984
y_gpu = DnnInstance.Gpu.AllocateDevice(_Z),
9085
dy_gpu = DnnInstance.Gpu.AllocateDevice(dy))
9186
{
@@ -130,7 +125,6 @@ void IDisposable.Dispose()
130125
// Private Dispose method
131126
private void Dispose()
132127
{
133-
_X.TryFree();
134128
_Z.TryFree();
135129
}
136130

Unit/NeuralNetwork.NET.Cuda.Unit/CuDnnInceptionLayerTest.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ public unsafe void Inception1x1()
4949
Tensor.New(xTensor.Entities, xTensor.Length, out Tensor z1);
5050
KerasWeightsProvider.FillWithHeEtAlUniform(z1, 10);
5151
z1.Duplicate(out Tensor z2);
52-
conv.Backpropagate(aConv, z1, ActivationFunctions.ReLUPrime);
53-
inception.Backpropagate(aInc, z2, ActivationFunctions.ReLUPrime);
52+
conv.Backpropagate(Tensor.Null, aConv, z1, ActivationFunctions.ReLUPrime);
53+
inception.Backpropagate(xTensor, aInc, z2, ActivationFunctions.ReLUPrime);
5454
Assert.IsTrue(z1.ContentEquals(z2));
5555

5656
// Gradient
@@ -119,9 +119,9 @@ public unsafe void Inception3x3Pipeline()
119119
Tensor.New(xTensor.Entities, xTensor.Length, out Tensor z1);
120120
KerasWeightsProvider.FillWithHeEtAlUniform(z1, 10);
121121
z1.Duplicate(out Tensor z2);
122-
conv2.Backpropagate(aConv, zTemp, conv1.ActivationFunctions.ActivationPrime);
123-
conv1.Backpropagate(zTemp, z1, ActivationFunctions.ReLUPrime);
124-
inception.Backpropagate(aInc, z2, ActivationFunctions.ReLUPrime);
122+
conv2.Backpropagate(Tensor.Null, aConv, zTemp, conv1.ActivationFunctions.ActivationPrime);
123+
conv1.Backpropagate(Tensor.Null, zTemp, z1, ActivationFunctions.ReLUPrime);
124+
inception.Backpropagate(xTensor, aInc, z2, ActivationFunctions.ReLUPrime);
125125
Assert.IsTrue(z1.ContentEquals(z2));
126126

127127
// Gradient
@@ -188,9 +188,9 @@ public unsafe void Inception5x5Pipeline()
188188
Tensor.New(xTensor.Entities, xTensor.Length, out Tensor z1);
189189
KerasWeightsProvider.FillWithHeEtAlUniform(z1, 10);
190190
z1.Duplicate(out Tensor z2);
191-
conv2.Backpropagate(aConv, zTemp, conv1.ActivationFunctions.ActivationPrime);
192-
conv1.Backpropagate(zTemp, z1, ActivationFunctions.ReLUPrime);
193-
inception.Backpropagate(aInc, z2, ActivationFunctions.ReLUPrime);
191+
conv2.Backpropagate(Tensor.Null, aConv, zTemp, conv1.ActivationFunctions.ActivationPrime);
192+
conv1.Backpropagate(Tensor.Null, zTemp, z1, ActivationFunctions.ReLUPrime);
193+
inception.Backpropagate(xTensor, aInc, z2, ActivationFunctions.ReLUPrime);
194194
Assert.IsTrue(z1.ContentEquals(z2));
195195

196196
// Gradient
@@ -253,9 +253,9 @@ public unsafe void InceptionPoolPipeline()
253253
Tensor.New(xTensor.Entities, xTensor.Length, out Tensor z1);
254254
KerasWeightsProvider.FillWithHeEtAlUniform(z1, 10);
255255
z1.Duplicate(out Tensor z2);
256-
conv.Backpropagate(aConv, zTemp, pool.ActivationFunctions.ActivationPrime);
257-
pool.Backpropagate(zTemp, z1, ActivationFunctions.ReLUPrime);
258-
inception.Backpropagate(aInc, z2, ActivationFunctions.ReLUPrime);
256+
conv.Backpropagate(Tensor.Null, aConv, zTemp, pool.ActivationFunctions.ActivationPrime);
257+
pool.Backpropagate(xTensor, zTemp, z1, ActivationFunctions.ReLUPrime);
258+
inception.Backpropagate(xTensor, aInc, z2, ActivationFunctions.ReLUPrime);
259259
Assert.IsTrue(z1.ContentEquals(z2));
260260

261261
// Gradient

0 commit comments

Comments
 (0)