PHP code example of rubix / cifar-10

1. Go to this page and download the library: Download rubix/cifar-10 library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

rubix / cifar-10 example snippets


use function Rubix\ML\enumerate;

$files = glob('train/*.png');

define('CHUNK_SIZE', 10000);

$samples = $labels = [];

foreach ($files as $file) {
    $samples[] = [imagecreatefrompng($file)];
    $labels[] = preg_replace('/[0-9]+_(.*).png/', '$1', basename($file));
}

$training = new Labeled($samples, $labels);

use Rubix\ML\Transformers\PersistentTransformer;
use Rubix\ML\Transformers\Pipeline;
use Rubix\ML\Transformers\ImageResizer;
use Rubix\ML\Transformers\ImageVectorizer;
use Rubix\ML\Transformers\FloatTypeConverter;
use Rubix\ML\Transformers\ZScaleStandardizer;
use Rubix\ML\Persisters\Filesystem;

$transformer = new PersistentTransformer(
    base: new Pipeline([
        new ImageResizer(32, 32),
        new ImageVectorizer(),
        new FloatTypeConverter(),
        new ZScaleStandardizer(),
    ]),
    persister: new Filesystem('transformer.rbx', true)
);

use Rubix\ML\Transformers\Pipeline;
use Rubix\ML\Transformers\ImageFlipper;
use Rubix\ML\Transformers\ColorJitter;

$augmenter = new Pipeline([
    new ImageFlipper(),
    new ColorJitter(
        brightness: 0.1,
        contrast: 0.1,
        saturation: 0.1
    ),
]);

use Rubix\ML\PersistentModel;
use Rubix\ML\Classifiers\MultilayerPerceptron;
use Rubix\ML\NeuralNet\Layers\Dense;
use Rubix\ML\NeuralNet\Layers\Activation;
use Rubix\ML\NeuralNet\Layers\BatchNorm;
use Rubix\ML\NeuralNet\ActivationFunctions\SiLU;
use Rubix\ML\NeuralNet\Optimizers\Adam;
use Rubix\ML\NeuralNet\Optimizers\Schedulers\Constant;
use Rubix\ML\Persisters\Filesystem;
use Rubix\ML\Loggers\Screen;

$estimator = new PersistentModel(
    base: new MultilayerPerceptron(
        hiddenLayers: [
            new Dense(512),
            new Activation(new SiLU()),
            new Dense(512, bias: false),
            new BatchNorm(),
            new Activation(new SiLU()),
            new Dense(512),
            new Activation(new SiLU()),
            new Dense(256, bias: false),
            new BatchNorm(),
            new Activation(new SiLU()),
            new Dense(128),
            new Activation(new SiLU()),
            new Dense(10),
        ],
        batchSize: 32,
        gradientAccumulationSteps: 4,
        optimizer: new Adam(new Constant(0.0001)),
        maxGradientNorm: 1.0,
        evalInterval: 1,
        window: 5,
    ),
    persister: new Filesystem('model.rbx', true)
);

$logger = new Screen();

$estimator->setLogger($logger);

use Rubix\ML\Datasets\Labeled;

$samples = $labels = [];

foreach (glob('test/*.png') as $file) {
    $samples[] = [imagecreatefrompng($file)];
    $labels[] = preg_replace('/[0-9]+_(.*).png/', '$1', basename($file));
}

$testing = new Labeled($samples, $labels);

$transformer->fit($testing);

$testing->apply($transformer);

$estimator->setValidationDataset($testing);

define('NUM_REPETITIONS', 3);

$chunks = array_chunk($files, CHUNK_SIZE);

for ($i = 0; $i < NUM_REPETITIONS; $i++) {
    foreach (enumerate($chunks, start: 1) as $j => $files) {
        $logger->info("Training on chunk #{$j}");

        $samples = $labels = [];

        foreach ($files as $file) {
            $samples[] = [imagecreatefrompng($file)];
            $labels[] = preg_replace('/[0-9]+_(.*).png/', '$1', basename($file));
        }

        $training = new Labeled($samples, $labels);

        $training->apply($augmenter);

        $transformer->update($training);

        $training->apply($transformer);

        $estimator->partial($training);
    }
}

if (strtolower(trim(readline('Save this model? (y|[n]): '))) === 'y') {
    $transformer->save();
    $estimator->save();
}

$samples = $labels = [];

foreach (glob('test/*.png') as $file) {
    $samples[] = [imagecreatefrompng($file)];
    $labels[] = preg_replace('/[0-9]+_(.*).png/', '$1', basename($file));
}

use Rubix\ML\Datasets\Labeled;

$dataset = new Labeled($samples, $labels);

use Rubix\ML\Transformers\PersistentTransformer;
use Rubix\ML\PersistentModel;
use Rubix\ML\Persisters\Filesystem;

$transformer = PersistentTransformer::load(new Filesystem('transformer.rbx'));

$estimator = PersistentModel::load(new Filesystem('model.rbx'));

$estimator->cleanup();

$dataset->apply($transformer);

$predictions = $estimator->predict($dataset);

use Rubix\ML\CrossValidation\Reports\AggregateReport;
use Rubix\ML\CrossValidation\Reports\ConfusionMatrix;
use Rubix\ML\CrossValidation\Reports\MulticlassBreakdown;

$report = new AggregateReport([
    new MulticlassBreakdown(),
    new ConfusionMatrix(),
]);

$results = $report->generate($predictions, $dataset->labels());

echo $results;

$results->toJSON()->saveTo(new Filesystem('report.json'));
sh
$ php train.php
sh
$ php validate.php