1. Test Modules
  2. Training Characteristics
    1. Input Learning
      1. Gradient Descent
      2. Conjugate Gradient Descent
      3. Limited-Memory BFGS
    2. Results
  3. Results

Subreport: Logs for com.simiacryptus.ref.lang.ReferenceCountingBase

Test Modules

Using Seed 2643832260541832192

Training Characteristics

Input Learning

In this apply, we use a network to learn this target input, given it's pre-evaluated output:

TrainingTester.java:332 executed in 0.01 seconds (0.000 gc):

    return RefArrays.stream(RefUtil.addRef(input_target)).flatMap(RefArrays::stream).map(x -> {
      try {
        return x.prettyPrint();
      } finally {
        x.freeRef();
      }
    }).reduce((a, b) -> a + "\n" + b).orElse("");

Returns

    [
    	[ [ 0.048, -1.72, 1.764 ], [ -0.128, 0.08, 1.208 ] ],
    	[ [ -1.028, -0.608, 0.496 ], [ 1.524, 0.7, -0.384 ] ]
    ]
    [
    	[ [ -0.852 ], [ -0.804 ] ],
    	[ [ -1.688 ], [ 1.912 ] ]
    ]
    [
    	[ [ 1.208, 0.7, -0.128 ], [ -1.028, 0.08, -0.608 ] ],
    	[ [ -1.72, 1.764, -0.384 ], [ 0.048, 0.496, 1.524 ] ]
    ]
    [
    	[ [ -0.852 ], [ -1.688 ] ],
    	[ [ 1.912 ], [ -0.804 ] ]
    ]
    [
    	[ [ 1.764, -1.72, -0.608 ], [ 0.7, -1.028, 1.208 ] ],
    	[ [ 0.496, 1.524, 0.08 ], [ -0.384, 0.048, -0.128 ] ]
    ]
    [
    	[ [ -1.688 ], [ 1.912 ] ],
    	[ [ -0.804 ], [ -0.852 ] ]
    ]
    [
    	[ [ -1.72, 0.7, -0.384 ], [ -1.028, -0.608, 1.208 ] ],
    	[ [ 1.524, 0.496, 1.764 ], [ -0.128, 0.08, 0.048 ] ]
    ]
    [
    	[ [ 1.912 ], [ -1.688 ] ],
    	[ [ -0.852 ], [ -0.804 ] ]
    ]
    [
    	[ [ -0.608, 1.764, -0.128 ], [ 0.048, 1.524, 1.208 ] ],
    	[ [ -1.72, 0.496, -1.028 ], [ 0.7, 0.08, -0.384 ] ]
    ]
    [
    	[ [ -0.804 ], [ 1.912 ] ],
    	[ [ -1.688 ], [ -0.852 ] ]
    ]

Gradient Descent

First, we train using basic gradient descent method apply weak line search conditions.

TrainingTester.java:480 executed in 0.30 seconds (0.000 gc):

    IterativeTrainer iterativeTrainer = new IterativeTrainer(trainable.addRef());
    try {
      iterativeTrainer.setLineSearchFactory(label -> new ArmijoWolfeSearch());
      iterativeTrainer.setOrientation(new GradientDescent());
      iterativeTrainer.setMonitor(TrainingTester.getMonitor(history));
      iterativeTrainer.setTimeout(30, TimeUnit.SECONDS);
      iterativeTrainer.setMaxIterations(250);
      iterativeTrainer.setTerminateThreshold(0);
      return iterativeTrainer.run();
    } finally {
      iterativeTrainer.freeRef();
    }
Logging
Reset training subject: 1082403548015
BACKPROP_AGG_SIZE = 3
THREADS = 64
SINGLE_THREADED = false
Initialized CoreSettings = {
"backpropAggregationSize" : 3,
"jvmThreads" : 64,
"singleThreaded" : false
}
Reset training subject: 1082443117145
Constructing line search parameters: GD
th(0)=102.23098394784093;dx=-2.772522189018148E24
Armijo: th(2.154434690031884)=156.0371112714703; dx=1.9729552027628812E36 evalInputDelta=-53.80612732362938
Armijo: th(1.077217345015942)=156.04706283685005; dx=9.864776013802547E35 evalInputDelta=-53.81607888900912
Armijo: th(0.3590724483386473)=156.10151969293; dx=3.288258671251705E35 evalInputDelta=-53.87053574508907
Armijo: th(0.08976811208466183)=156.73947604600667; dx=8.220646677951392E34 evalInputDelta=-54.508492098165746
Armijo: th(0.017953622416932366)=157.4179349058175; dx=1.6441293354005503E34 evalInputDelta=-55.18695095797658
Armijo: th(0.002992270402822061)=157.675174974939; dx=2.7402155570245817E33 evalInputDelta=-55.444191027098086
Armijo: th(4.2746720040315154E-4)=157.73016140933902; dx=3.914593632564238E32 evalInputDelta=-55.49917746149809
Armijo: th(5.343340005039394E-5)=157.7385526020188; dx=4.893241833190077E31 evalInputDelta=-55.50756865417789
Armijo: th(5.9370444500437714E-6)=157.73962540347745; dx=5.436933262120073E30 evalInputDelta=-55.50864145563652
Armijo: th(5.937044450043771E-7)=157.73974619695224; dx=5.4369119176974334E29 evalInputDelta=-55.508762249111314
Armijo: th(5.397313136403428E-8)=157.73975839947664; dx=4.942431597678084E28 evalInputDelta=-55.508774451635716
Armijo: th(4.4977609470028565E-9)=157.73975951805204; dx=4.116519029092615E27 evalInputDelta=-55.508775570211114
Armijo: th(3.4598161130791205E-10)=155.32909670086366; dx=3.144626721807724E26 evalInputDelta=-53.09811275302273
Armijo: th(2.4712972236279432E-11)=116.24332187374588; dx=2.0338906884792813E25 evalInputDelta=-14.012337925904959
New Minimum: 102.23098394784093 > 45.65894289919125
Armijo: th(1.6475314824186289E-12)=45.65894289919125; dx=-6.857912762870146E23 evalInputDelta=56.57204104864967
Armijo: th(1.029707176511643E-13)=102.26844638570914; dx=-2.67822524232386E24 evalInputDelta=-0.03746243786821424
Armijo: th(6.057101038303783E-15)=102.23312593910478; dx=-2.766975309800837E24 evalInputDelta=-0.0021419912638549476
MIN ALPHA (3.3650561323909904E-16): th(1.6475314824186289E-12)=45.65894289919125
Fitness changed from 102.23098394784093 to 45.65894289919125
Iteration 1 complete. Error: 45.65894289919125 Total: 0.2421; Orientation: 0.0044; Line Search: 0.1819
th(0)=45.65894289919125;dx=-4.246393949974538E23
Armijo: th(2.154434690031884E-15)=45.67816491267301; dx=-4.24495714965544E23 evalInputDelta=-0.019222013481758893
Armijo: th(1.077217345015942E-15)=45.66848066164782; dx=-4.24567554981501E23 evalInputDelta=-0.009537762456567123
MIN ALPHA (3.5907244833864734E-16): th(0.0)=45.65894289919125
Fitness changed from 45.65894289919125 to 45.65894289919125
Static Iteration Total: 0.0450; Orientation: 0.0016; Line Search: 0.0382
Iteration 2 failed. Error: 45.65894289919125
Previous Error: 0.0 -> 45.65894289919125
Optimization terminated 2
Final threshold in iteration 2: 45.65894289919125 (> 0.0) after 0.288s (< 30.000s)

Returns

    45.65894289919125

This training apply resulted in the following configuration:

TrainingTester.java:610 executed in 0.00 seconds (0.000 gc):

    RefList<double[]> state = network.state();
    assert state != null;
    String description = state.stream().map(RefArrays::toString).reduce((a, b) -> a + "\n" + b)
        .orElse("");
    state.freeRef();
    return description;

Returns

    

And regressed input:

TrainingTester.java:622 executed in 0.00 seconds (0.000 gc):

    return RefArrays.stream(RefUtil.addRef(data)).flatMap(x -> {
      return RefArrays.stream(x);
    }).limit(1).map(x -> {
      String temp_18_0015 = x.prettyPrint();
      x.freeRef();
      return temp_18_0015;
    }).reduce((a, b) -> a + "\n" + b).orElse("");

Returns

    [
    	[ [ 0.496, -1.7200000000004114, 1.208 ], [ 0.7000000000000648, -0.384, 1.524 ] ],
    	[ [ -0.12800000000446704, -0.4908370876196601, 0.048 ], [ -1.028000000000934, 1.40942697332009, -0.608 ] ]
    ]

To produce the following output:

TrainingTester.java:633 executed in 0.00 seconds (0.000 gc):

    Result[] array = ConstantResult.batchResultArray(pop(RefUtil.addRef(data)));
    @Nullable
    Result eval = layer.eval(array);
    assert eval != null;
    TensorList tensorList = Result.getData(eval);
    String temp_18_0016 = tensorList.stream().limit(1).map(x -> {
      String temp_18_0017 = x.prettyPrint();
      x.freeRef();
      return temp_18_0017;
    }).reduce((a, b) -> a + "\n" + b).orElse("");
    tensorList.freeRef();
    return temp_18_0016;

Returns

    [
    	[ [ -0.4225920000004119, 1.465440000001779, -1.0292160000010033 ], [ 1.3384000000001404, -0.7342080000000091, 2.913888000000036 ] ],
    	[ [ 0.212601102035173, 0.8152539511252558, -0.07972541326040755 ], [ 0.026785768661531165, -0.03672430433136156, 0.015842166679179138 ] ]
    ]

Conjugate Gradient Descent

First, we use a conjugate gradient descent method, which converges the fastest for purely linear functions.

TrainingTester.java:452 executed in 0.02 seconds (0.000 gc):

    IterativeTrainer iterativeTrainer = new IterativeTrainer(trainable.addRef());
    try {
      iterativeTrainer.setLineSearchFactory(label -> new QuadraticSearch());
      iterativeTrainer.setOrientation(new GradientDescent());
      iterativeTrainer.setMonitor(TrainingTester.getMonitor(history));
      iterativeTrainer.setTimeout(30, TimeUnit.SECONDS);
      iterativeTrainer.setMaxIterations(250);
      iterativeTrainer.setTerminateThreshold(0);
      return iterativeTrainer.run();
    } finally {
      iterativeTrainer.freeRef();
    }
Logging
Reset training subject: 1082704616372
Reset training subject: 1082708940754
Constructing line search parameters: GD
F(0.0) = LineSearchPoint{point=PointSample{avg=102.23098394784093}, derivative=-2.772522189018148E24}
F(1.0E-10) = LineSearchPoint{point=PointSample{avg=141.34364772811745}, derivative=8.908857674855878E25}, evalInputDelta = 39.11266378027652
141.34364772811745 <= 102.23098394784093
Converged to right
Fitness changed from 102.23098394784093 to 102.23098394784093
Static Iteration Total: 0.0211; Orientation: 0.0010; Line Search: 0.0103
Iteration 1 failed. Error: 102.23098394784093
Previous Error: 0.0 -> 102.23098394784093
Optimization terminated 1
Final threshold in iteration 1: 102.23098394784093 (> 0.0) after 0.021s (< 30.000s)

Returns

    102.23098394784093

This training apply resulted in the following configuration:

TrainingTester.java:610 executed in 0.00 seconds (0.000 gc):

    RefList<double[]> state = network.state();
    assert state != null;
    String description = state.stream().map(RefArrays::toString).reduce((a, b) -> a + "\n" + b)
        .orElse("");
    state.freeRef();
    return description;

Returns

    

And regressed input:

TrainingTester.java:622 executed in 0.00 seconds (0.000 gc):

    return RefArrays.stream(RefUtil.addRef(data)).flatMap(x -> {
      return RefArrays.stream(x);
    }).limit(1).map(x -> {
      String temp_18_0015 = x.prettyPrint();
      x.freeRef();
      return temp_18_0015;
    }).reduce((a, b) -> a + "\n" + b).orElse("");

Returns

    [
    	[ [ 0.496, -1.72, 1.208 ], [ 0.7, -0.384, 1.524 ] ],
    	[ [ -0.128, 0.08, 0.048 ], [ -1.028, 1.764, -0.608 ] ]
    ]

To produce the following output:

TrainingTester.java:633 executed in 0.00 seconds (0.000 gc):

    Result[] array = ConstantResult.batchResultArray(pop(RefUtil.addRef(data)));
    @Nullable
    Result eval = layer.eval(array);
    assert eval != null;
    TensorList tensorList = Result.getData(eval);
    String temp_18_0016 = tensorList.stream().limit(1).map(x -> {
      String temp_18_0017 = x.prettyPrint();
      x.freeRef();
      return temp_18_0017;
    }).reduce((a, b) -> a + "\n" + b).orElse("");
    tensorList.freeRef();
    return temp_18_0016;

Returns

    [
    	[ [ -0.42259199999999997, 1.4654399999999999, -1.029216 ], [ 1.3383999999999998, -0.734208, 2.913888 ] ],
    	[ [ 0.216064, -0.13504, -0.081024 ], [ 0.826512, -1.4182560000000002, 0.48883200000000004 ] ]
    ]

Limited-Memory BFGS

Next, we apply the same optimization using L-BFGS, which is nearly ideal for purely second-order or quadratic functions.

TrainingTester.java:509 executed in 0.17 seconds (0.000 gc):

    IterativeTrainer iterativeTrainer = new IterativeTrainer(trainable.addRef());
    try {
      iterativeTrainer.setLineSearchFactory(label -> new ArmijoWolfeSearch());
      iterativeTrainer.setOrientation(new LBFGS());
      iterativeTrainer.setMonitor(TrainingTester.getMonitor(history));
      iterativeTrainer.setTimeout(30, TimeUnit.SECONDS);
      iterativeTrainer.setIterationsPerSample(100);
      iterativeTrainer.setMaxIterations(250);
      iterativeTrainer.setTerminateThreshold(0);
      return iterativeTrainer.run();
    } finally {
      iterativeTrainer.freeRef();
    }
Logging
Reset training subject: 1082734578231
Reset training subject: 1082737694214
Adding measurement 617e1e7e to history. Total: 0
LBFGS Accumulation History: 1 points
Constructing line search parameters: GD
Non-optimal measurement 102.23098394784093 < 102.23098394784093. Total: 1
th(0)=102.23098394784093;dx=-2.772522189018148E24
Non-optimal measurement 156.0371112714703 < 102.23098394784093. Total: 1
Armijo: th(2.154434690031884)=156.0371112714703; dx=1.9729552027628812E36 evalInputDelta=-53.80612732362938
Non-optimal measurement 156.04706283685005 < 102.23098394784093. Total: 1
Armijo: th(1.077217345015942)=156.04706283685005; dx=9.864776013802547E35 evalInputDelta=-53.81607888900912
Non-optimal measurement 156.10151969293 < 102.23098394784093. Total: 1
Armijo: th(0.3590724483386473)=156.10151969293; dx=3.2882586712517055E35 evalInputDelta=-53.87053574508907
Non-optimal measurement 156.73947604600667 < 102.23098394784093. Total: 1
Armijo: th(0.08976811208466183)=156.73947604600667; dx=8.220646677951392E34 evalInputDelta=-54.508492098165746
Non-optimal measurement 157.4179349058175 < 102.23098394784093. Total: 1
Armijo: th(0.017953622416932366)=157.4179349058175; dx=1.6441293354005506E34 evalInputDelta=-55.18695095797658
Non-optimal measurement 157.675174974939 < 102.23098394784093. Total: 1
Armijo: th(0.002992270402822061)=157.675174974939; dx=2.7402155570245817E33 evalInputDelta=-55.444191027098086
Non-optimal measurement 157.73016140933902 < 102.23098394784093. Total: 1
Armijo: th(4.2746720040315154E-4)=157.73016140933902; dx=3.914593632564238E32 evalInputDelta=-55.49917746149809
Non-optimal measurement 157.7385526020188 < 102.23098394784093. Total: 1
Armijo: th(5.343340005039394E-5)=157.7385526020188; dx=4.893241833190077E31 evalInputDelta=-55.50756865417789
Non-optimal measurement 157.73962540347745 < 102.23098394784093. Total: 1
Armijo: th(5.9370444500437714E-6)=157.73962540347745; dx=5.436933262120073E30 evalInputDelta=-55.50864145563652
Non-optimal measurement 157.73974619695224 < 102.23098394784093. Total: 1
Armijo: th(5.937044450043771E-7)=157.73974619695224; dx=5.4369119176974334E29 evalInputDelta=-55.508762249111314
Non-optimal measurement 157.73975839947664 < 102.23098394784093. Total: 1
Armijo: th(5.397313136403428E-8)=157.73975839947664; dx=4.942431597678084E28 evalInputDelta=-55.508774451635716
Non-optimal measurement 157.73975951805204 < 102.23098394784093. Total: 1
Armijo: th(4.4977609470028565E-9)=157.73975951805204; dx=4.116519029092615E27 evalInputDelta=-55.508775570211114
Non-optimal measurement 155.32909670086366 < 102.23098394784093. Total: 1
Armijo: th(3.4598161130791205E-10)=155.32909670086366; dx=3.144626721807724E26 evalInputDelta=-53.09811275302273
Non-optimal measurement 116.24332187374588 < 102.23098394784093. Total: 1
Armijo: th(2.4712972236279432E-11)=116.24332187374588; dx=2.0338906884792813E25 evalInputDelta=-14.012337925904959
Adding measurement 4d7f161b to history. Total: 1
New Minimum: 102.23098394784093 > 45.65894289919125
Armijo: th(1.6475314824186289E-12)=45.65894289919125; dx=-6.857912762870146E23 evalInputDelta=56.57204104864967
Non-optimal measurement 102.26844638570914 < 45.65894289919125. Total: 2
Armijo: th(1.029707176511643E-13)=102.26844638570914; dx=-2.67822524232386E24 evalInputDelta=-0.03746243786821424
Non-optimal measurement 102.23312593910478 < 45.65894289919125. Total: 2
Armijo: th(6.057101038303783E-15)=102.23312593910478; dx=-2.766975309800837E24 evalInputDelta=-0.0021419912638549476
Non-optimal measurement 45.65894289919125 < 45.65894289919125. Total: 2
MIN ALPHA (3.3650561323909904E-16): th(1.6475314824186289E-12)=45.65894289919125
Fitness changed from 102.23098394784093 to 45.65894289919125
Iteration 1 complete. Error: 45.65894289919125 Total: 0.1457; Orientation: 0.0037; Line Search: 0.1316
Non-optimal measurement 45.65894289919125 < 45.65894289919125. Total: 2
LBFGS Accumulation History: 2 points
Non-optimal measurement 45.65894289919125 < 45.65894289919125. Total: 2
th(0)=45.65894289919125;dx=-4.246393949974538E23
Non-optimal measurement 45.67816491267301 < 45.65894289919125. Total: 2
Armijo: th(2.154434690031884E-15)=45.67816491267301; dx=-4.24495714965544E23 evalInputDelta=-0.019222013481758893
Non-optimal measurement 45.66848066164782 < 45.65894289919125. Total: 2
Armijo: th(1.077217345015942E-15)=45.66848066164782; dx=-4.245675549815011E23 evalInputDelta=-0.009537762456567123
Non-optimal measurement 45.65894289919125 < 45.65894289919125. Total: 2
MIN ALPHA (3.5907244833864734E-16): th(0.0)=45.65894289919125
Fitness changed from 45.65894289919125 to 45.65894289919125
Static Iteration Total: 0.0198; Orientation: 0.0015; Line Search: 0.0153
Iteration 2 failed. Error: 45.65894289919125
Previous Error: 0.0 -> 45.65894289919125
Optimization terminated 2
Final threshold in iteration 2: 45.65894289919125 (> 0.0) after 0.166s (< 30.000s)

Returns

    45.65894289919125

This training apply resulted in the following configuration:

TrainingTester.java:610 executed in 0.00 seconds (0.000 gc):

    RefList<double[]> state = network.state();
    assert state != null;
    String description = state.stream().map(RefArrays::toString).reduce((a, b) -> a + "\n" + b)
        .orElse("");
    state.freeRef();
    return description;

Returns

    

And regressed input:

TrainingTester.java:622 executed in 0.00 seconds (0.000 gc):

    return RefArrays.stream(RefUtil.addRef(data)).flatMap(x -> {
      return RefArrays.stream(x);
    }).limit(1).map(x -> {
      String temp_18_0015 = x.prettyPrint();
      x.freeRef();
      return temp_18_0015;
    }).reduce((a, b) -> a + "\n" + b).orElse("");

Returns

    [
    	[ [ 0.496, -1.7200000000004114, 1.208 ], [ 0.7000000000000648, -0.384, 1.524 ] ],
    	[ [ -0.12800000000446704, -0.4908370876196601, 0.048 ], [ -1.028000000000934, 1.40942697332009, -0.608 ] ]
    ]

To produce the following output:

TrainingTester.java:633 executed in 0.00 seconds (0.000 gc):

    Result[] array = ConstantResult.batchResultArray(pop(RefUtil.addRef(data)));
    @Nullable
    Result eval = layer.eval(array);
    assert eval != null;
    TensorList tensorList = Result.getData(eval);
    String temp_18_0016 = tensorList.stream().limit(1).map(x -> {
      String temp_18_0017 = x.prettyPrint();
      x.freeRef();
      return temp_18_0017;
    }).reduce((a, b) -> a + "\n" + b).orElse("");
    tensorList.freeRef();
    return temp_18_0016;

Returns

    [
    	[ [ -0.4225920000004119, 1.465440000001779, -1.0292160000010033 ], [ 1.3384000000001404, -0.7342080000000091, 2.913888000000036 ] ],
    	[ [ 0.212601102035173, 0.8152539511252558, -0.07972541326040755 ], [ 0.026785768661531165, -0.03672430433136156, 0.015842166679179138 ] ]
    ]

TrainingTester.java:432 executed in 0.09 seconds (0.000 gc):

    return TestUtil.compare(title + " vs Iteration", runs);
Logging
Plotting range=[0.0, 0.6595258524375607], [2.0, 2.659525852437561]; valueStats=DoubleSummaryStatistics{count=2, sum=91.317886, min=45.658943, average=45.658943, max=45.658943}
Only 1 points for GD
Only 1 points for LBFGS

Returns

Result

TrainingTester.java:435 executed in 0.01 seconds (0.000 gc):

    return TestUtil.compareTime(title + " vs Time", runs);
Logging
Plotting range=[-1.0, 0.6595258524375607], [1.0, 2.659525852437561]; valueStats=DoubleSummaryStatistics{count=2, sum=91.317886, min=45.658943, average=45.658943, max=45.658943}
Only 1 points for GD
Only 0 points for LBFGS

Returns

Result

Results

TrainingTester.java:255 executed in 0.00 seconds (0.000 gc):

    return grid(inputLearning, modelLearning, completeLearning);

Returns

Result

TrainingTester.java:258 executed in 0.00 seconds (0.000 gc):

    return new ComponentResult(null == inputLearning ? null : inputLearning.value,
        null == modelLearning ? null : modelLearning.value, null == completeLearning ? null : completeLearning.value);

Returns

    {"input":{ "LBFGS": { "type": "NonConverged", "value": 45.65894289919125 }, "CjGD": { "type": "NonConverged", "value": NaN }, "GD": { "type": "NonConverged", "value": 45.65894289919125 } }, "model":null, "complete":null}

LayerTests.java:425 executed in 0.00 seconds (0.000 gc):

    throwException(exceptions.addRef());

Results

detailsresult
{"input":{ "LBFGS": { "type": "NonConverged", "value": 45.65894289919125 }, "CjGD": { "type": "NonConverged", "value": NaN }, "GD": { "type": "NonConverged", "value": 45.65894289919125 } }, "model":null, "complete":null}OK
  {
    "result": "OK",
    "performance": {
      "execution_time": "1.054",
      "gc_time": "0.194"
    },
    "created_on": 1586735670203,
    "file_name": "trainingTest",
    "report": {
      "simpleName": "Basic",
      "canonicalName": "com.simiacryptus.mindseye.layers.java.ImgPixelGateLayerTest.Basic",
      "link": "https://github.com/SimiaCryptus/mindseye-java/tree/93db34cedee48c0202777a2b25deddf1dfaf5731/src/test/java/com/simiacryptus/mindseye/layers/java/ImgPixelGateLayerTest.java",
      "javaDoc": ""
    },
    "training_analysis": {
      "input": {
        "LBFGS": {
          "type": "NonConverged",
          "value": 45.65894289919125
        },
        "CjGD": {
          "type": "NonConverged",
          "value": "NaN"
        },
        "GD": {
          "type": "NonConverged",
          "value": 45.65894289919125
        }
      }
    },
    "archive": "s3://code.simiacrypt.us/tests/com/simiacryptus/mindseye/layers/java/ImgPixelGateLayer/Basic/trainingTest/202004125430",
    "id": "b0d73e0a-0aa8-417f-ac47-5091ccebb130",
    "report_type": "Components",
    "display_name": "Comparative Training",
    "target": {
      "simpleName": "ImgPixelGateLayer",
      "canonicalName": "com.simiacryptus.mindseye.layers.java.ImgPixelGateLayer",
      "link": "https://github.com/SimiaCryptus/mindseye-java/tree/93db34cedee48c0202777a2b25deddf1dfaf5731/src/main/java/com/simiacryptus/mindseye/layers/java/ImgPixelGateLayer.java",
      "javaDoc": ""
    }
  }