Java Deep Learning Learning Framework

We recently released the first version of the new DeepJava (DJ) 0.01 deep learning framework .

The main goal of the framework, at least for the moment, is purely educational. We are building a step-by-step framework with:

  • there will be a clear code base
  • there will be a set of brunches by which you can step by step follow the process of creation and understand why certain changes were made

Together with our first release, we also released the first chapter of an open book on deep learning. The book is written for Java engineers who have not previously dealt with neural networks. At the same time, the learning process is built around creating your own framework from scratch:

When creating our training framework, we will introduce new concepts and entities only where and when it is really necessary. For example, in the first release, the presentation of the network is done in the way instinctively most engineers want to do it, in the form of a graph (and not a set of tensors). This allows you to create more flexible networks. Since we already have code that trains the MNIst model , we can see how slowly this representation of the network works. Now, having encountered this problem, in the following chapters we will introduce the reader to the basics of linear algebra in the volume that is necessary to solve exactly this problem. Etc. we plan to introduce entities where necessary, as problems arise until we look at the framework.

A few small buns:


If anyone saw our video “ neural networks in 30 minutes ”, then here is a small code example on how to recreate a network from a video on DJ:

var context = new Context(
         /* learningRate */ 0.2, 
         /* debug mode */ false);

var inputFriend = new InputNeuron("friend");
var inputVodka = new InputNeuron("vodka");
var inputSunny = new InputNeuron("sunny");

var outputNeuron
        = new ConnectedNeuron.Builder()
            .activationFunction(new Sigmoid())

inputFriend.connect(outputNeuron, wFriend);
inputVodka.connect(outputNeuron, wVodka);
inputSunny.connect(outputNeuron, wSunny);

// Посылаем входные сигналы:
inputFriend.forwardSignalReceived(null, 1.);
inputVodka.forwardSignalReceived(null, 1.);
inputSunny.forwardSignalReceived(null, 1.);

// Получаем итоговый результат и считаем ошибку:
double result = outputNeuron.getForwardResult();
double expectedResult = 1.;
double errorDy = 2. * (expectedResult - result);

// Посылаем обратно ошибку: