MindsEye
Comprehensive Java 8 convolutional neural network library with GPU acceleration, novel optimization algorithms, and comprehensive test-driven development. Core component of the complete AI suite, featuring unique innovations like QQN, deterministic memory management, and input learning capabilities.
Key Features
Advanced GPU Acceleration
Multi-level CuDNN integration with data locality awareness, memory management, and precision optimization. Supports CUDA, OpenCL via Aparapi, and multi-GPU configurations.
- CuDNN integration for high performance
- Data locality optimization for multi-GPU systems
- Configurable floating-point precision for speed optimization
- Aparapi-based OpenCL and pure Java implementations
- Hybrid reference counting memory management
Novel Optimization Algorithms
Comprehensive optimization engine with experimental methods including Quadratic Quasi-Newton (QQN), Recursive Subspace Optimization, and Trust Regions.
- Quadratic Quasi-Newton (QQN) - hybrid SGD/Quasi-Newton approach
- Recursive Subspace Optimization for imbalanced networks
- Trust Regions including OWL-QN for sparse models
- Adaptive Training Supervisor with dynamic hyperparameters
- Modular optimization components (Iterator, Orienter, Stepper, Monitor)
- L-BFGS, momentum, L1/L2 normalization support
- Line search methods: Armijo/Wolfe, Quadratic, Bisection
Advanced Architecture & Testing
Modular layer system with comprehensive test-driven development and rich documentation generation.
- Tensor-Layer-DeltaSet pattern for composable operations
- DAG, Pipeline, Supervised, and Composite network topologies
- Finite difference validation for all components
- Auto-generated component documentation with test reports
- JSON serialization with HDF5 model import support
- Notebook output format with markdown, HTML, and PDF export
- Visitor API for network traversal and modification
Unique Capabilities
Pioneering features including input learning, deep dream, style transfer, and comprehensive model analysis tools.
- Input Learning - modify training data during optimization
- Deep Dream and artistic style transfer implementations
- Object location and texture generation capabilities
- VGG16/VGG19 and Inception model imports
- Autoencoder and denoising implementations
- Batch invariance testing and validation
- Extensive monitoring with real-time metrics
- A/B testing framework for optimization comparison
Hybrid Reference Counting Memory Management
Revolutionary memory management system combining explicit reference counting with Java's garbage collection, specifically designed for deep learning workloads.
- Thread-safe reference counting with atomic operations
- Double-checked locking to ensure single disposal
- Liveness checks to prevent use-after-free errors
- Optional stack trace tracking for debugging
- Gradual adoption strategy for incremental migration
- Deterministic deallocation enabling performance optimizations
- Static analysis framework for correctness verification
- Reference-aware standard library wrappers (RefList, RefMap, RefSet)
Getting Started
Gradle Dependency
implementation 'com.simiacryptus:mindseye-java:2.1.0'
// For GPU acceleration (optional)
implementation 'com.simiacryptus:mindseye-cudnn:2.1.0'
Quick Example
Getting Started with MindsEye
1. Basic Feedforward Network (MNIST Classification)
import com.simiacryptus.mindseye.network.PipelineNetwork;
import com.simiacryptus.mindseye.layers.java.*;
import com.simiacryptus.mindseye.opt.*;
// Create a basic feedforward network for MNIST digit classification
PipelineNetwork network = new PipelineNetwork(1)
.add(new DenseLayer(784, 128)) // Input: 28x28 pixels = 784
.add(new ReLuActivationLayer()) // ReLU activation
.add(new DenseLayer(128, 64)) // Hidden layer
.add(new ReLuActivationLayer())
.add(new DenseLayer(64, 10)) // Output: 10 digit classes
.add(new SoftmaxActivationLayer()); // Softmax for classification
// Load and prepare training data
Tensor[][] trainingData = loadMNISTData(); // Your data loading method
// Configure comprehensive training monitoring
TrainingMonitor monitor = new TrainingMonitor()
.setLogLevel(Level.INFO)
.setMaxIterations(1000)
.setIterationsPerSample(100) // Log every 100 iterations
.setTimeoutMinutes(30); // 30-minute timeout
// Set up L-BFGS optimizer with monitoring
IterativeTrainer trainer = new IterativeTrainer(network)
.setOrienter(new LBFGS())
.setMonitor(monitor)
.setTimeout(10, TimeUnit.MINUTES);
// Start training
trainer.run();
// Evaluate the trained model
double accuracy = evaluateAccuracy(network, testData);
System.out.println("Test Accuracy: " + accuracy + "%");
2. Convolutional Neural Network (Image Classification)
// Create a CNN for advanced image classification
PipelineNetwork cnn = new PipelineNetwork(1)
// First convolutional block
.add(new ConvolutionLayer(5, 5, 3, 32)) // 5x5 kernel, RGB->32 channels
.add(new ReLuActivationLayer())
.add(new PoolingLayer().setMode(PoolingLayer.PoolingMode.Max))
// Second convolutional block
.add(new ConvolutionLayer(5, 5, 32, 64)) // 32->64 channels
.add(new ReLuActivationLayer())
.add(new PoolingLayer().setMode(PoolingLayer.PoolingMode.Max))
// Fully connected layers
.add(new DenseLayer(1024, 512)) // Flatten and dense
.add(new DropoutLayer(0.5)) // Regularization
.add(new DenseLayer(512, 10)) // Final classification
.add(new SoftmaxActivationLayer());
// Advanced training configuration
IterativeTrainer cnnTrainer = new IterativeTrainer(cnn)
.setOrienter(new AdamOptimizer(0.001)) // Adam with learning rate
.setMonitor(new TrainingMonitor()
.setMaxIterations(5000)
.setValidationData(validationSet)) // Include validation
.setTimeout(2, TimeUnit.HOURS); // Longer training time
cnnTrainer.run();
3. GPU Acceleration Setup
// Initialize CUDA system (requires CUDA installation)
CudaSystem.initialize();
// Enable GPU acceleration for the network
network.setParallel(true);
// Configure memory and precision settings
network.setPrecision(Precision.Float); // Use 32-bit for speed
CudaMemory.setDefaultMemoryMode(CudaMemory.MemoryMode.Managed);
// Monitor GPU memory usage
CudaMemory.addMemoryHandler(new CudaMemory.MemoryHandler() {
@Override
public void handle(CudaMemory.MemoryInfo info) {
System.out.println("GPU Memory: " + info.getUsedMemory() + "/" + info.getTotalMemory());
}
});
// Multi-GPU configuration (if available)
CudaSystem.setDefaultDevice(0); // Use first GPU
// CudaSystem.setDefaultDevice(1); // Switch to second GPU
4. Advanced Features & Customization
// Custom loss functions
network.setLossFunction(new MeanSquaredError());
// network.setLossFunction(new CrossEntropyLoss());
// network.setLossFunction(new HingeLoss());
// Advanced optimizers with scheduling
AdamOptimizer adam = new AdamOptimizer()
.setLearningRate(0.001)
.setBeta1(0.9)
.setBeta2(0.999)
.setEpsilon(1e-8);
// Learning rate scheduling
trainer.setOrienter(new ScheduledOptimizer(adam)
.addSchedule(1000, 0.0005) // Reduce LR after 1000 iterations
.addSchedule(3000, 0.0001)); // Further reduce after 3000
// Model persistence
network.writeToFile(new File("trained_model.json"));
// Load pre-trained model
PipelineNetwork loadedNetwork = PipelineNetwork.fromFile(new File("trained_model.json"));
// Export to different formats
network.exportToONNX("model.onnx"); // ONNX format
network.exportToTensorFlow("model.pb"); // TensorFlow format
5. Unique MindsEye Features
Input Learning (Modify Training Data)
// Enable input learning to optimize training data itself
InputLearningTrainer inputTrainer = new InputLearningTrainer(network)
.setInputLearningRate(0.01)
.setDataAugmentation(true);
inputTrainer.run(trainingData);
Deep Dream Implementation
// Create artistic visualizations
DeepDreamNetwork dreamNet = new DeepDreamNetwork(pretrainedVGG)
.setTargetLayer("conv4_1")
.setIterations(100)
.setLearningRate(0.01);
Tensor dreamImage = dreamNet.process(inputImage);
A/B Testing Framework
// Compare different architectures
ABTestFramework abTest = new ABTestFramework()
.addModel("ModelA", networkA)
.addModel("ModelB", networkB)
.setTestData(testSet)
.setSignificanceLevel(0.05);
ABTestResult result = abTest.run();
System.out.println("Winner: " + result.getBestModel());
System.out.println("Confidence: " + result.getConfidence());
6. Monitoring & Debugging
// Comprehensive monitoring setup
TrainingMonitor advancedMonitor = new TrainingMonitor()
.setLogLevel(Level.DEBUG)
.addMetric("loss", new LossMetric())
.addMetric("accuracy", new AccuracyMetric())
.addMetric("gradient_norm", new GradientNormMetric())
.setPlotting(true) // Generate training plots
.setNotebookOutput("training_log.html"); // HTML report
// Real-time visualization
monitor.addVisualization(new NetworkVisualization(network));
monitor.addVisualization(new LossPlot());
monitor.addVisualization(new AccuracyPlot());
Pro Tips
Performance Optimization
- Use GPU acceleration for large models (>1M parameters)
- Enable mixed precision for 2x speed improvement
- Batch your data for optimal GPU utilization
- Monitor memory usage to prevent OOM errors
Debugging
- Enable finite difference validation during development
- Use smaller learning rates if training is unstable
- Add gradient clipping for RNN/LSTM networks
- Visualize network activations to debug dead neurons
Best Practices
- Always use validation data to prevent overfitting
- Implement early stopping based on validation loss
- Save model checkpoints during long training runs
- Use A/B testing to compare architectural changes
Technical Details
Technologies
Requirements
- Java 8 or higher
- CUDA 10.0+ and CuDNN (optional, for GPU acceleration)
- OpenCL support (optional, for Aparapi acceleration)
- Minimum 4GB RAM (8GB+ recommended for large models)
- Maven 3.0+ for building from source
Contribute to the Project
This is an open-source project. Contributions, bug reports, and feature requests are welcome from the community.