use of com.simiacryptus.util.io.NotebookOutput in project MindsEye by SimiaCryptus.
the class EncodingUtil method renderLayer.
/**
* Render layer.
*
* @param log the log
* @param dataPipeline the data pipeline
* @param row the row
* @param col the col
* @param tensor the tensor
*/
public static void renderLayer(@Nonnull final NotebookOutput log, @Nonnull final List<Layer> dataPipeline, @Nonnull final LinkedHashMap<CharSequence, Object> row, final int col, @Nonnull final Tensor tensor) {
row.put("Data_" + col, TestUtil.render(log, tensor, 0 < col));
if (dataPipeline.size() >= col - 1 && 1 < col) {
@Nonnull final PipelineNetwork decoder = new PipelineNetwork();
for (int i = col - 2; i >= 0; i--) {
decoder.add(dataPipeline.get(i));
}
@Nullable final Tensor decoded = decoder.eval(tensor).getData().get(0);
row.put("Decode_" + col, TestUtil.render(log, decoded, false));
final List<Tensor> rawComponents = IntStream.range(0, tensor.getDimensions()[2]).mapToObj(band -> EncodingUtil.findUnitComponent(decoder, band, tensor)).collect(Collectors.toList());
@Nullable final Tensor baseline = EncodingUtil.findBaseline(decoder, tensor);
final List<Tensor> signedComponents = IntStream.range(0, tensor.getDimensions()[2]).mapToObj(band -> rawComponents.get(band).minus(baseline)).collect(Collectors.toList());
row.put("SVG_" + col, log.file(EncodingUtil.decompositionSvg(log, baseline, signedComponents), "svg" + EncodingUtil.svgNumber++ + ".svg", "SVG Composite Image"));
row.put("GIF_" + col, EncodingUtil.animatedGif(log, baseline, signedComponents));
@Nonnull final CharSequence render = signedComponents.stream().map(signedContribution -> TestUtil.render(log, signedContribution, true)).reduce((a, b) -> a + "" + b).get();
row.put("Band_Decode_" + col, render);
}
}
use of com.simiacryptus.util.io.NotebookOutput in project MindsEye by SimiaCryptus.
the class FindPCAFeatures method findFeatureSpace.
/**
* Find feature space tensor [ ].
*
* @param log the log
* @param featureVectors the feature vectors
* @param components the components
* @return the tensor [ ]
*/
protected Tensor[] findFeatureSpace(@Nonnull final NotebookOutput log, @Nonnull final Supplier<Stream<Tensor[]>> featureVectors, final int components) {
return log.code(() -> {
final int column = 1;
@Nonnull final Tensor[] prototype = featureVectors.get().findAny().get();
@Nonnull final int[] dimensions = prototype[column].getDimensions();
RealMatrix covariance = PCAUtil.getCovariance(() -> featureVectors.get().map(x -> x[column].getData()));
return PCAUtil.pcaFeatures(covariance, components, dimensions, -1);
});
}
use of com.simiacryptus.util.io.NotebookOutput in project MindsEye by SimiaCryptus.
the class PipelineTest method test.
/**
* Test double.
*
* @param log the log
* @param layer the layer
* @param header the header
* @param inputDims the input dims
* @return the double
*/
@Nullable
public TrainingTester.ComponentResult test(@Nonnull final NotebookOutput log, @Nonnull final Layer layer, final String header, @Nonnull final int[]... inputDims) {
@Nonnull final Layer component = layer.copy();
final Tensor[] randomize = randomize(inputDims);
new SerializationTest().test(log, component, randomize);
return new TrainingTester() {
@Override
protected void printHeader(NotebookOutput log) {
log.h1(header);
}
}.test(log, component, randomize);
}
use of com.simiacryptus.util.io.NotebookOutput in project MindsEye by SimiaCryptus.
the class DeepDream method train.
/**
* Train buffered image.
*
* @param server the server
* @param log the log
* @param canvasImage the canvas image
* @param network the network
* @param precision the precision
* @param trainingMinutes the training minutes
* @return the buffered image
*/
@Nonnull
public BufferedImage train(final StreamNanoHTTPD server, @Nonnull final NotebookOutput log, final BufferedImage canvasImage, final PipelineNetwork network, final Precision precision, final int trainingMinutes) {
System.gc();
Tensor canvas = Tensor.fromRGB(canvasImage);
TestUtil.monitorImage(canvas, false, false);
network.setFrozen(true);
ArtistryUtil.setPrecision(network, precision);
@Nonnull Trainable trainable = new ArrayTrainable(network, 1).setVerbose(true).setMask(true).setData(Arrays.asList(new Tensor[][] { { canvas } }));
TestUtil.instrumentPerformance(network);
if (null != server)
ArtistryUtil.addLayersHandler(network, server);
log.code(() -> {
@Nonnull ArrayList<StepRecord> history = new ArrayList<>();
new IterativeTrainer(trainable).setMonitor(TestUtil.getMonitor(history)).setIterationsPerSample(100).setOrientation(new TrustRegionStrategy() {
@Override
public TrustRegion getRegionPolicy(final Layer layer) {
return new RangeConstraint();
}
}).setLineSearchFactory(name -> new BisectionSearch().setSpanTol(1e-1).setCurrentRate(1e3)).setTimeout(trainingMinutes, TimeUnit.MINUTES).setTerminateThreshold(Double.NEGATIVE_INFINITY).runAndFree();
return TestUtil.plot(history);
});
return canvas.toImage();
}
use of com.simiacryptus.util.io.NotebookOutput in project MindsEye by SimiaCryptus.
the class ObjectLocation method run.
/**
* Run.
*
* @param log the log
*/
public void run(@Nonnull final NotebookOutput log) {
@Nonnull String logName = "cuda_" + log.getName() + ".log";
log.p(log.file((String) null, logName, "GPU Log"));
CudaSystem.addLog(new PrintStream(log.file(logName)));
ImageClassifier classifier = getClassifierNetwork();
Layer classifyNetwork = classifier.getNetwork();
ImageClassifier locator = getLocatorNetwork();
Layer locatorNetwork = locator.getNetwork();
ArtistryUtil.setPrecision((DAGNetwork) classifyNetwork, Precision.Float);
ArtistryUtil.setPrecision((DAGNetwork) locatorNetwork, Precision.Float);
Tensor[][] inputData = loadImages_library();
// Tensor[][] inputData = loadImage_Caltech101(log);
double alphaPower = 0.8;
final AtomicInteger index = new AtomicInteger(0);
Arrays.stream(inputData).limit(10).forEach(row -> {
log.h3("Image " + index.getAndIncrement());
final Tensor img = row[0];
log.p(log.image(img.toImage(), ""));
Result classifyResult = classifyNetwork.eval(new MutableResult(row));
Result locationResult = locatorNetwork.eval(new MutableResult(row));
Tensor classification = classifyResult.getData().get(0);
List<CharSequence> categories = classifier.getCategories();
int[] sortedIndices = IntStream.range(0, categories.size()).mapToObj(x -> x).sorted(Comparator.comparing(i -> -classification.get(i))).mapToInt(x -> x).limit(10).toArray();
logger.info(Arrays.stream(sortedIndices).mapToObj(i -> String.format("%s: %s = %s%%", i, categories.get(i), classification.get(i) * 100)).reduce((a, b) -> a + "\n" + b).orElse(""));
Map<CharSequence, Tensor> vectors = new HashMap<>();
List<CharSequence> predictionList = Arrays.stream(sortedIndices).mapToObj(categories::get).collect(Collectors.toList());
Arrays.stream(sortedIndices).limit(10).forEach(category -> {
CharSequence name = categories.get(category);
log.h3(name);
Tensor alphaTensor = renderAlpha(alphaPower, img, locationResult, classification, category);
log.p(log.image(img.toRgbImageAlphaMask(0, 1, 2, alphaTensor), ""));
vectors.put(name, alphaTensor.unit());
});
Tensor avgDetection = vectors.values().stream().reduce((a, b) -> a.add(b)).get().scale(1.0 / vectors.size());
Array2DRowRealMatrix covarianceMatrix = new Array2DRowRealMatrix(predictionList.size(), predictionList.size());
for (int x = 0; x < predictionList.size(); x++) {
for (int y = 0; y < predictionList.size(); y++) {
Tensor l = vectors.get(predictionList.get(x)).minus(avgDetection);
Tensor r = vectors.get(predictionList.get(y)).minus(avgDetection);
covarianceMatrix.setEntry(x, y, l.dot(r));
}
}
@Nonnull final EigenDecomposition decomposition = new EigenDecomposition(covarianceMatrix);
for (int objectVector = 0; objectVector < 10; objectVector++) {
log.h3("Eigenobject " + objectVector);
double eigenvalue = decomposition.getRealEigenvalue(objectVector);
RealVector eigenvector = decomposition.getEigenvector(objectVector);
Tensor detectionRegion = IntStream.range(0, eigenvector.getDimension()).mapToObj(i -> vectors.get(predictionList.get(i)).scale(eigenvector.getEntry(i))).reduce((a, b) -> a.add(b)).get();
detectionRegion = detectionRegion.scale(255.0 / detectionRegion.rms());
CharSequence categorization = IntStream.range(0, eigenvector.getDimension()).mapToObj(i -> {
CharSequence category = predictionList.get(i);
double component = eigenvector.getEntry(i);
return String.format("<li>%s = %.4f</li>", category, component);
}).reduce((a, b) -> a + "" + b).get();
log.p(String.format("Object Detected: <ol>%s</ol>", categorization));
log.p("Object Eigenvalue: " + eigenvalue);
log.p("Object Region: " + log.image(img.toRgbImageAlphaMask(0, 1, 2, detectionRegion), ""));
log.p("Object Region Compliment: " + log.image(img.toRgbImageAlphaMask(0, 1, 2, detectionRegion.scale(-1)), ""));
}
// final int[] orderedVectors = IntStream.range(0, 10).mapToObj(x -> x)
// .sorted(Comparator.comparing(x -> -decomposition.getRealEigenvalue(x))).mapToInt(x -> x).toArray();
// IntStream.range(0, orderedVectors.length)
// .mapToObj(i -> {
// //double realEigenvalue = decomposition.getRealEigenvalue(orderedVectors[i]);
// return decomposition.getEigenvector(orderedVectors[i]).toArray();
// }
// ).toArray(i -> new double[i][]);
log.p(String.format("<table><tr><th>Cosine Distance</th>%s</tr>%s</table>", Arrays.stream(sortedIndices).limit(10).mapToObj(col -> "<th>" + categories.get(col) + "</th>").reduce((a, b) -> a + b).get(), Arrays.stream(sortedIndices).limit(10).mapToObj(r -> {
return String.format("<tr><td>%s</td>%s</tr>", categories.get(r), Arrays.stream(sortedIndices).limit(10).mapToObj(col -> {
return String.format("<td>%.4f</td>", Math.acos(vectors.get(categories.get(r)).dot(vectors.get(categories.get(col)))));
}).reduce((a, b) -> a + b).get());
}).reduce((a, b) -> a + b).orElse("")));
});
log.setFrontMatterProperty("status", "OK");
}
Aggregations