Search in sources :

Example 96 with Result

use of com.simiacryptus.mindseye.lang.Result in project MindsEye by SimiaCryptus.

the class BatchDerivativeTester method getFeedbackGradient.

@Nonnull
private Tensor getFeedbackGradient(@Nonnull final Layer component, final int inputIndex, @Nonnull final Tensor outputPrototype, final Tensor... inputPrototype) {
    final Tensor inputTensor = inputPrototype[inputIndex];
    final int inputDims = inputTensor.length();
    @Nonnull final Tensor result = new Tensor(inputDims, outputPrototype.length());
    for (int j = 0; j < outputPrototype.length(); j++) {
        final int j_ = j;
        @Nonnull final PlaceholderLayer<Tensor> inputKey = new PlaceholderLayer<Tensor>(new Tensor());
        @Nonnull final Result copyInput = new Result(TensorArray.create(inputPrototype), (@Nonnull final DeltaSet<Layer> buffer, @Nonnull final TensorList data) -> {
            @Nonnull final Tensor gradientBuffer = new Tensor(inputDims, outputPrototype.length());
            if (!Arrays.equals(inputTensor.getDimensions(), data.get(inputIndex).getDimensions())) {
                throw new AssertionError();
            }
            for (int i = 0; i < inputDims; i++) {
                gradientBuffer.set(new int[] { i, j_ }, data.get(inputIndex).getData()[i]);
            }
            buffer.get(inputKey, new double[gradientBuffer.length()]).addInPlace(gradientBuffer.getData());
        }) {

            @Override
            public boolean isAlive() {
                return true;
            }
        };
        @Nullable final Result eval = component.eval(copyInput);
        @Nonnull final DeltaSet<Layer> xxx = new DeltaSet<Layer>();
        @Nonnull TensorArray tensorArray = TensorArray.wrap(eval.getData().stream().map(x -> {
            @Nonnull Tensor set = x.set(j_, 1);
            x.freeRef();
            return set;
        }).toArray(i -> new Tensor[i]));
        eval.accumulate(xxx, tensorArray);
        final Delta<Layer> inputDelta = xxx.getMap().get(inputKey);
        if (null != inputDelta) {
            result.addInPlace(new Tensor(inputDelta.getDelta(), result.getDimensions()));
        }
    }
    return result;
}
Also used : IntStream(java.util.stream.IntStream) Arrays(java.util.Arrays) Logger(org.slf4j.Logger) LoggerFactory(org.slf4j.LoggerFactory) Tensor(com.simiacryptus.mindseye.lang.Tensor) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) DoubleBuffer(com.simiacryptus.mindseye.lang.DoubleBuffer) Result(com.simiacryptus.mindseye.lang.Result) Collectors(java.util.stream.Collectors) Delta(com.simiacryptus.mindseye.lang.Delta) List(java.util.List) ConstantResult(com.simiacryptus.mindseye.lang.ConstantResult) ToleranceStatistics(com.simiacryptus.mindseye.test.ToleranceStatistics) ScalarStatistics(com.simiacryptus.util.data.ScalarStatistics) TensorList(com.simiacryptus.mindseye.lang.TensorList) PlaceholderLayer(com.simiacryptus.mindseye.layers.java.PlaceholderLayer) Layer(com.simiacryptus.mindseye.lang.Layer) TensorArray(com.simiacryptus.mindseye.lang.TensorArray) DeltaSet(com.simiacryptus.mindseye.lang.DeltaSet) SimpleEval(com.simiacryptus.mindseye.test.SimpleEval) NotebookOutput(com.simiacryptus.util.io.NotebookOutput) Nonnull(javax.annotation.Nonnull) Nullable(javax.annotation.Nullable) Tensor(com.simiacryptus.mindseye.lang.Tensor) Nonnull(javax.annotation.Nonnull) DeltaSet(com.simiacryptus.mindseye.lang.DeltaSet) TensorList(com.simiacryptus.mindseye.lang.TensorList) PlaceholderLayer(com.simiacryptus.mindseye.layers.java.PlaceholderLayer) Layer(com.simiacryptus.mindseye.lang.Layer) Result(com.simiacryptus.mindseye.lang.Result) ConstantResult(com.simiacryptus.mindseye.lang.ConstantResult) TensorArray(com.simiacryptus.mindseye.lang.TensorArray) Nullable(javax.annotation.Nullable) PlaceholderLayer(com.simiacryptus.mindseye.layers.java.PlaceholderLayer) Nonnull(javax.annotation.Nonnull)

Example 97 with Result

use of com.simiacryptus.mindseye.lang.Result in project MindsEye by SimiaCryptus.

the class BatchDerivativeTester method testFrozen.

/**
 * Test frozen.
 *
 * @param component      the component
 * @param inputPrototype the input prototype
 */
public void testFrozen(@Nonnull final Layer component, @Nonnull final Tensor[] inputPrototype) {
    @Nonnull final AtomicBoolean reachedInputFeedback = new AtomicBoolean(false);
    @Nonnull final Layer frozen = component.copy().freeze();
    @Nullable final Result eval = frozen.eval(new Result(TensorArray.create(inputPrototype), (@Nonnull final DeltaSet<Layer> buffer, @Nonnull final TensorList data) -> {
        reachedInputFeedback.set(true);
    }) {

        @Override
        public boolean isAlive() {
            return true;
        }
    });
    @Nonnull final DeltaSet<Layer> buffer = new DeltaSet<Layer>();
    TensorList tensorList = eval.getData().copy();
    eval.accumulate(buffer, tensorList);
    final List<Delta<Layer>> deltas = component.state().stream().map(doubles -> {
        return buffer.stream().filter(x -> x.target == doubles).findFirst().orElse(null);
    }).filter(x -> x != null).collect(Collectors.toList());
    if (!deltas.isEmpty() && !component.state().isEmpty()) {
        throw new AssertionError("Frozen component listed in delta. Deltas: " + deltas);
    }
    final int inElements = Arrays.stream(inputPrototype).mapToInt(x -> x.length()).sum();
    if (!reachedInputFeedback.get() && 0 < inElements) {
        throw new RuntimeException("Frozen component did not pass input backwards");
    }
}
Also used : IntStream(java.util.stream.IntStream) Arrays(java.util.Arrays) Logger(org.slf4j.Logger) LoggerFactory(org.slf4j.LoggerFactory) Tensor(com.simiacryptus.mindseye.lang.Tensor) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) DoubleBuffer(com.simiacryptus.mindseye.lang.DoubleBuffer) Result(com.simiacryptus.mindseye.lang.Result) Collectors(java.util.stream.Collectors) Delta(com.simiacryptus.mindseye.lang.Delta) List(java.util.List) ConstantResult(com.simiacryptus.mindseye.lang.ConstantResult) ToleranceStatistics(com.simiacryptus.mindseye.test.ToleranceStatistics) ScalarStatistics(com.simiacryptus.util.data.ScalarStatistics) TensorList(com.simiacryptus.mindseye.lang.TensorList) PlaceholderLayer(com.simiacryptus.mindseye.layers.java.PlaceholderLayer) Layer(com.simiacryptus.mindseye.lang.Layer) TensorArray(com.simiacryptus.mindseye.lang.TensorArray) DeltaSet(com.simiacryptus.mindseye.lang.DeltaSet) SimpleEval(com.simiacryptus.mindseye.test.SimpleEval) NotebookOutput(com.simiacryptus.util.io.NotebookOutput) Nonnull(javax.annotation.Nonnull) Nullable(javax.annotation.Nullable) Nonnull(javax.annotation.Nonnull) DeltaSet(com.simiacryptus.mindseye.lang.DeltaSet) TensorList(com.simiacryptus.mindseye.lang.TensorList) PlaceholderLayer(com.simiacryptus.mindseye.layers.java.PlaceholderLayer) Layer(com.simiacryptus.mindseye.lang.Layer) Result(com.simiacryptus.mindseye.lang.Result) ConstantResult(com.simiacryptus.mindseye.lang.ConstantResult) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Delta(com.simiacryptus.mindseye.lang.Delta) Nullable(javax.annotation.Nullable)

Example 98 with Result

use of com.simiacryptus.mindseye.lang.Result in project MindsEye by SimiaCryptus.

the class DAGNetwork method eval.

@Nullable
@Override
public Result eval(final Result... input) {
    assertAlive();
    @Nonnull GraphEvaluationContext buildExeCtx = buildExeCtx(input);
    @Nullable Result result;
    try {
        result = getHead().get(buildExeCtx);
    } finally {
        buildExeCtx.freeRef();
    }
    return result;
}
Also used : Nonnull(javax.annotation.Nonnull) Nullable(javax.annotation.Nullable) Result(com.simiacryptus.mindseye.lang.Result) Nullable(javax.annotation.Nullable)

Example 99 with Result

use of com.simiacryptus.mindseye.lang.Result in project MindsEye by SimiaCryptus.

the class ImgPixelSoftmaxLayer method eval.

/**
 * Eval nn result.
 *
 * @param input the input
 * @return the nn result
 */
@Nonnull
public Result eval(@Nonnull final Result input) {
    final TensorList inputData = input.getData();
    inputData.addRef();
    input.addRef();
    int[] inputDims = inputData.getDimensions();
    assert 3 == inputDims.length;
    final int inputBands = inputDims[2];
    final int width = inputDims[0];
    final int height = inputDims[1];
    TensorArray maxima = TensorArray.wrap(inputData.stream().map(inputTensor -> {
        try {
            return new Tensor(width, height, 1).setByCoord(c -> {
                return IntStream.range(0, inputBands).mapToDouble(band -> {
                    int[] coords = c.getCoords();
                    return inputTensor.get(coords[0], coords[1], band);
                }).max().getAsDouble();
            });
        } finally {
            inputTensor.freeRef();
        }
    }).toArray(i -> new Tensor[i]));
    TensorArray exps = TensorArray.wrap(IntStream.range(0, inputData.length()).mapToObj(index -> {
        final Tensor inputTensor = inputData.get(index);
        Tensor maxTensor = maxima.get(index);
        try {
            return new Tensor(inputDims).setByCoord(c -> {
                int[] coords = c.getCoords();
                return Math.exp(inputTensor.get(c) - maxTensor.get(coords[0], coords[1], 0));
            });
        } finally {
            inputTensor.freeRef();
            maxTensor.freeRef();
        }
    }).toArray(i -> new Tensor[i]));
    maxima.freeRef();
    TensorArray sums = TensorArray.wrap(exps.stream().map(expTensor -> {
        try {
            return new Tensor(width, height, 1).setByCoord(c -> {
                return IntStream.range(0, inputBands).mapToDouble(band -> {
                    int[] coords = c.getCoords();
                    return expTensor.get(coords[0], coords[1], band);
                }).sum();
            });
        } finally {
            expTensor.freeRef();
        }
    }).toArray(i -> new Tensor[i]));
    TensorArray output = TensorArray.wrap(IntStream.range(0, inputData.length()).mapToObj(index -> {
        Tensor sumTensor = sums.get(index);
        Tensor expTensor = exps.get(index);
        try {
            return new Tensor(inputDims).setByCoord(c -> {
                int[] coords = c.getCoords();
                return (expTensor.get(c) / sumTensor.get(coords[0], coords[1], 0));
            });
        } finally {
            sumTensor.freeRef();
            expTensor.freeRef();
        }
    }).toArray(i -> new Tensor[i]));
    return new Result(output, (@Nonnull final DeltaSet<Layer> buffer, @Nonnull final TensorList delta) -> {
        if (input.isAlive()) {
            TensorArray dots = TensorArray.wrap(IntStream.range(0, inputData.length()).mapToObj(index -> {
                final Tensor deltaTensor = delta.get(index);
                Tensor expTensor = exps.get(index);
                try {
                    return new Tensor(width, height, 1).setByCoord(c -> {
                        return IntStream.range(0, inputBands).mapToDouble(band -> {
                            int[] coords = c.getCoords();
                            return expTensor.get(coords[0], coords[1], band) * deltaTensor.get(coords[0], coords[1], band);
                        }).sum();
                    });
                } finally {
                    expTensor.freeRef();
                    deltaTensor.freeRef();
                }
            }).toArray(i -> new Tensor[i]));
            TensorArray passback = TensorArray.wrap(IntStream.range(0, inputData.length()).mapToObj(index -> {
                final Tensor deltaTensor = delta.get(index);
                final Tensor expTensor = exps.get(index);
                Tensor sumTensor = sums.get(index);
                Tensor dotTensor = dots.get(index);
                try {
                    return new Tensor(inputDims).setByCoord(c -> {
                        int[] coords = c.getCoords();
                        double sum = sumTensor.get(coords[0], coords[1], 0);
                        double dot = dotTensor.get(coords[0], coords[1], 0);
                        double deltaValue = deltaTensor.get(c);
                        double expValue = expTensor.get(c);
                        return (sum * deltaValue - dot) * expValue / (sum * sum);
                    });
                } finally {
                    deltaTensor.freeRef();
                    expTensor.freeRef();
                    sumTensor.freeRef();
                    dotTensor.freeRef();
                }
            }).toArray(i -> new Tensor[i]));
            input.accumulate(buffer, passback);
            dots.freeRef();
        }
    }) {

        @Override
        protected void _free() {
            inputData.freeRef();
            input.freeRef();
            sums.freeRef();
            exps.freeRef();
        }

        @Override
        public boolean isAlive() {
            return input.isAlive() || !isFrozen();
        }
    };
}
Also used : IntStream(java.util.stream.IntStream) JsonObject(com.google.gson.JsonObject) Arrays(java.util.Arrays) Logger(org.slf4j.Logger) LoggerFactory(org.slf4j.LoggerFactory) Tensor(com.simiacryptus.mindseye.lang.Tensor) Result(com.simiacryptus.mindseye.lang.Result) DataSerializer(com.simiacryptus.mindseye.lang.DataSerializer) List(java.util.List) LayerBase(com.simiacryptus.mindseye.lang.LayerBase) TensorList(com.simiacryptus.mindseye.lang.TensorList) Map(java.util.Map) Layer(com.simiacryptus.mindseye.lang.Layer) TensorArray(com.simiacryptus.mindseye.lang.TensorArray) DeltaSet(com.simiacryptus.mindseye.lang.DeltaSet) Nonnull(javax.annotation.Nonnull) Tensor(com.simiacryptus.mindseye.lang.Tensor) Nonnull(javax.annotation.Nonnull) TensorArray(com.simiacryptus.mindseye.lang.TensorArray) DeltaSet(com.simiacryptus.mindseye.lang.DeltaSet) TensorList(com.simiacryptus.mindseye.lang.TensorList) Result(com.simiacryptus.mindseye.lang.Result) Nonnull(javax.annotation.Nonnull)

Example 100 with Result

use of com.simiacryptus.mindseye.lang.Result in project MindsEye by SimiaCryptus.

the class ImgPixelSumLayer method evalAndFree.

/**
 * Eval nn result.
 *
 * @param input the input
 * @return the nn result
 */
@Nonnull
public Result evalAndFree(@Nonnull final Result input) {
    final TensorList inputData = input.getData();
    int[] inputDims = inputData.getDimensions();
    assert 3 == inputDims.length;
    return new Result(TensorArray.wrap(inputData.stream().map(tensor -> {
        Tensor result = new Tensor(inputDims[0], inputDims[1], 1).setByCoord(c -> {
            return IntStream.range(0, inputDims[2]).mapToDouble(i -> {
                int[] coords = c.getCoords();
                return tensor.get(coords[0], coords[1], i);
            }).sum();
        });
        tensor.freeRef();
        return result;
    }).toArray(i -> new Tensor[i])), (@Nonnull final DeltaSet<Layer> buffer, @Nonnull final TensorList delta) -> {
        if (input.isAlive()) {
            @Nonnull TensorArray tensorArray = TensorArray.wrap(delta.stream().map(deltaTensor -> {
                int[] deltaDims = deltaTensor.getDimensions();
                Tensor result = new Tensor(deltaDims[0], deltaDims[1], inputDims[2]).setByCoord(c -> {
                    int[] coords = c.getCoords();
                    return deltaTensor.get(coords[0], coords[1], 0);
                });
                deltaTensor.freeRef();
                return result;
            }).toArray(i -> new Tensor[i]));
            input.accumulate(buffer, tensorArray);
        }
    }) {

        @Override
        protected void _free() {
            inputData.freeRef();
            input.freeRef();
        }

        @Override
        public boolean isAlive() {
            return input.isAlive() || !isFrozen();
        }
    };
}
Also used : IntStream(java.util.stream.IntStream) JsonObject(com.google.gson.JsonObject) Arrays(java.util.Arrays) Logger(org.slf4j.Logger) LoggerFactory(org.slf4j.LoggerFactory) Tensor(com.simiacryptus.mindseye.lang.Tensor) Result(com.simiacryptus.mindseye.lang.Result) DataSerializer(com.simiacryptus.mindseye.lang.DataSerializer) List(java.util.List) LayerBase(com.simiacryptus.mindseye.lang.LayerBase) TensorList(com.simiacryptus.mindseye.lang.TensorList) Map(java.util.Map) Layer(com.simiacryptus.mindseye.lang.Layer) TensorArray(com.simiacryptus.mindseye.lang.TensorArray) DeltaSet(com.simiacryptus.mindseye.lang.DeltaSet) Nonnull(javax.annotation.Nonnull) Tensor(com.simiacryptus.mindseye.lang.Tensor) Nonnull(javax.annotation.Nonnull) TensorArray(com.simiacryptus.mindseye.lang.TensorArray) DeltaSet(com.simiacryptus.mindseye.lang.DeltaSet) TensorList(com.simiacryptus.mindseye.lang.TensorList) Result(com.simiacryptus.mindseye.lang.Result) Nonnull(javax.annotation.Nonnull)

Aggregations

Result (com.simiacryptus.mindseye.lang.Result)123 Nonnull (javax.annotation.Nonnull)120 Nullable (javax.annotation.Nullable)113 Layer (com.simiacryptus.mindseye.lang.Layer)101 TensorList (com.simiacryptus.mindseye.lang.TensorList)100 DeltaSet (com.simiacryptus.mindseye.lang.DeltaSet)96 Arrays (java.util.Arrays)94 Tensor (com.simiacryptus.mindseye.lang.Tensor)91 List (java.util.List)88 IntStream (java.util.stream.IntStream)80 Map (java.util.Map)77 JsonObject (com.google.gson.JsonObject)70 TensorArray (com.simiacryptus.mindseye.lang.TensorArray)70 DataSerializer (com.simiacryptus.mindseye.lang.DataSerializer)69 LayerBase (com.simiacryptus.mindseye.lang.LayerBase)65 Logger (org.slf4j.Logger)59 LoggerFactory (org.slf4j.LoggerFactory)59 ReferenceCounting (com.simiacryptus.mindseye.lang.ReferenceCounting)30 ConstantResult (com.simiacryptus.mindseye.lang.ConstantResult)25 Stream (java.util.stream.Stream)25