Перевод материала подготовлен в рамках онлайн-курса "Kotlin Backend Developer".

Приглашаем также всех желающих на бесплатный демо-урок «Объектно-ориентированное программирование в Kotlin». Цели занятия:
- знать элементы объектной модели Kotlin;
- создавать различные классы и объекты;
- выполнять наследование и делегирование;
- пользоваться геттерами и сеттерами.


Привет, друзья! Сегодня мы расскажем о первой предварительной версии KotlinDL (v.0.1.0) — высокоуровневого фреймворка для глубокого обучения, похожего на Keras, но написанного на Kotlin. В нем есть простые API для создания, тренировки и развертывания моделей глубокого обучения в среде JVM. Высокоуровневые API и точно настроенные параметры позволяют быстро приступить к работе с KotlinDL. Для создания и обучения своей первой нейронной сети вам достаточно написать всего несколько строк на Kotlin:

private val model = Sequential.of(
    Input(28, 28, 1),
    Flatten(),
    Dense(300),
    Dense(100),
    Dense(10)
)

fun main() {
    val (train, test) = Dataset.createTrainAndTestDatasets(
        trainFeaturesPath = "datasets/mnist/train-images-idx3-ubyte.gz",
        trainLabelsPath = "datasets/mnist/train-labels-idx1-ubyte.gz",
        testFeaturesPath = "datasets/mnist/t10k-images-idx3-ubyte.gz",
        testLabelsPath = "datasets/mnist/t10k-labels-idx1-ubyte.gz",
        numClasses = 10,
        ::extractImages,
        ::extractLabels
    )
    val (newTrain, validation) = train.split(splitRatio = 0.95)

    model.use {
        it.compile(
            optimizer = Adam(),
            loss = Losses.SOFT_MAX_CROSS_ENTROPY_WITH_LOGITS,
            metric = Metrics.ACCURACY
        )

        it.summary()

        it.fit(
            dataset = newTrain,
            epochs = 10,
            batchSize = 100,
            verbose = false
        )

        val accuracy = it.evaluate(
            dataset = validation,
            batchSize = 100
        ).metrics[Metrics.ACCURACY]

        println("Accuracy: $accuracy")
        it.save(File("src/model/my_model"))
    }
}

Поддержка GPU

Тренировка моделей — ресурсоемкая задача. Использование GPU может значительно ускорить этот процесс. Здесь на помощь придет KotlinDL! Для запуска кода на устройстве NVIDIA нужно добавить всего одну зависимость.

Широкие возможности API

В KotlinDL есть все необходимые API для создания и тренировки нейронных сетей прямого распространения, включая сверточные сети. В нем по умолчанию установлены разумные значения для большинства гиперпараметров. Фреймворк предлагает широкий выбор оптимизаторов, инициализаторов веса, функций активации и прочих возможностей для тонкой настройки модели. Вы можете сохранить полученную модель и импортировать ее в бэкенд-приложение JVM.

Импорт моделей, обученных на Keras

Встроенные в KotlinDL API позволяют создавать, тренировать и сохранять модели глубокого обучения и использовать их для работы с новыми данными. Можно импортировать и использовать модель, обученную с помощью KotlinDL или Keras версии 2.* на языке Python.

И для тех и для других моделей доступен метод трансферного обучения: просто загрузите уже имеющуюся обученную модель и подгоните ее под свою задачу.

Временные ограничения

В текущей альфа-версии доступно только несколько слоев: Input()Flatten()Dense()Dropout()Conv2D()MaxPool2D() и AvgPool2D(). Это означает, что пока поддерживаются не все модели, обученные с помощью Keras. Можно импортировать и настроить обученные модели VGG-16 или VGG-19, а вот модель ResNet50, например, загрузить не получится. В следующих релизах появятся новые слои.

Еще одно временное ограничение связано с развертыванием. Вы можете развернуть модель в серверной части JVM-среды, однако поддержка устройств Android появится только в следующих версиях.

Что под капотом?

KotlinDL использует TensorFlow Java API, который активно развивается сообществом разработчиков открытого ПО.

Попробуйте сами!

Мы подготовили несколько статей (на английском языке), которые помогут вам начать работу с KotlinDL:

Будем рады получить ваши отзывы и пул-реквесты в GitHub Issues. Присоединяйтесь к каналу #deeplearning в Slack-сообществе Kotlin.


Узнать подробнее о курсе "Kotlin Backend Developer"

Смотреть вебинар «Объектно-ориентированное программирование в Kotlin»