{"id":15036986,"url":"https://github.com/kotlin/kotlindl","last_synced_at":"2025-05-15T05:05:57.640Z","repository":{"id":38188572,"uuid":"249948572","full_name":"Kotlin/kotlindl","owner":"Kotlin","description":"High-level Deep Learning Framework written in Kotlin and inspired by Keras","archived":false,"fork":false,"pushed_at":"2024-05-31T08:05:58.000Z","size":342720,"stargazers_count":1530,"open_issues_count":79,"forks_count":107,"subscribers_count":41,"default_branch":"master","last_synced_at":"2025-05-15T05:05:43.130Z","etag":null,"topics":["deeplearning","gpu","kotlin","tensorflow"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Kotlin.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-03-25T10:27:21.000Z","updated_at":"2025-05-06T07:32:28.000Z","dependencies_parsed_at":"2024-12-06T01:17:19.589Z","dependency_job_id":null,"html_url":"https://github.com/Kotlin/kotlindl","commit_stats":null,"previous_names":["jetbrains/kotlindl"],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kotlin%2Fkotlindl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kotlin%2Fkotlindl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kotlin%2Fkotlindl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kotlin%2Fkotlindl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Kotlin","download_url":"https://codeload.github.com/Kotlin/kotlindl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254276447,"owners_count":22043867,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["deeplearning","gpu","kotlin","tensorflow"],"created_at":"2024-09-24T20:32:57.684Z","updated_at":"2025-05-15T05:05:52.629Z","avatar_url":"https://github.com/Kotlin.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# KotlinDL: High-level Deep Learning API in Kotlin [![official JetBrains project](http://jb.gg/badges/incubator.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)\n\n[![Kotlin](https://img.shields.io/badge/kotlin-1.8.21-blue.svg?logo=kotlin)](http://kotlinlang.org)\n[![Slack channel](https://img.shields.io/badge/chat-slack-green.svg?logo=slack)](https://kotlinlang.slack.com/messages/kotlindl/)\n\nKotlinDL is a high-level Deep Learning API written in Kotlin and inspired by [Keras](https://keras.io). \nUnder the hood, it uses TensorFlow Java API and ONNX Runtime API for Java. KotlinDL offers simple APIs for training deep learning models from scratch, \nimporting existing Keras and ONNX models for inference, and leveraging transfer learning for tailoring existing pre-trained models to your tasks. \n\nThis project aims to make Deep Learning easier for JVM and Android developers and simplify deploying deep learning models in production environments.\n\nHere's an example of what a classic convolutional neural network LeNet would look like in KotlinDL:\n\n```kotlin\nprivate const val EPOCHS = 3\nprivate const val TRAINING_BATCH_SIZE = 1000\nprivate const val NUM_CHANNELS = 1L\nprivate const val IMAGE_SIZE = 28L\nprivate const val SEED = 12L\nprivate const val TEST_BATCH_SIZE = 1000\n\nprivate val lenet5Classic = Sequential.of(\n    Input(\n        IMAGE_SIZE,\n        IMAGE_SIZE,\n        NUM_CHANNELS\n    ),\n    Conv2D(\n        filters = 6,\n        kernelSize = intArrayOf(5, 5),\n        strides = intArrayOf(1, 1, 1, 1),\n        activation = Activations.Tanh,\n        kernelInitializer = GlorotNormal(SEED),\n        biasInitializer = Zeros(),\n        padding = ConvPadding.SAME\n    ),\n    AvgPool2D(\n        poolSize = intArrayOf(1, 2, 2, 1),\n        strides = intArrayOf(1, 2, 2, 1),\n        padding = ConvPadding.VALID\n    ),\n    Conv2D(\n        filters = 16,\n        kernelSize = intArrayOf(5, 5),\n        strides = intArrayOf(1, 1, 1, 1),\n        activation = Activations.Tanh,\n        kernelInitializer = GlorotNormal(SEED),\n        biasInitializer = Zeros(),\n        padding = ConvPadding.SAME\n    ),\n    AvgPool2D(\n        poolSize = intArrayOf(1, 2, 2, 1),\n        strides = intArrayOf(1, 2, 2, 1),\n        padding = ConvPadding.VALID\n    ),\n    Flatten(), // 3136\n    Dense(\n        outputSize = 120,\n        activation = Activations.Tanh,\n        kernelInitializer = GlorotNormal(SEED),\n        biasInitializer = Constant(0.1f)\n    ),\n    Dense(\n        outputSize = 84,\n        activation = Activations.Tanh,\n        kernelInitializer = GlorotNormal(SEED),\n        biasInitializer = Constant(0.1f)\n    ),\n    Dense(\n        outputSize = 10,\n        activation = Activations.Linear,\n        kernelInitializer = GlorotNormal(SEED),\n        biasInitializer = Constant(0.1f)\n    )\n)\n\n\nfun main() {\n    val (train, test) = mnist()\n    \n    lenet5Classic.use {\n        it.compile(\n            optimizer = Adam(clipGradient = ClipGradientByValue(0.1f)),\n            loss = Losses.SOFT_MAX_CROSS_ENTROPY_WITH_LOGITS,\n            metric = Metrics.ACCURACY\n        )\n    \n        it.logSummary()\n    \n        it.fit(dataset = train, epochs = EPOCHS, batchSize = TRAINING_BATCH_SIZE)\n    \n        val accuracy = it.evaluate(dataset = test, batchSize = TEST_BATCH_SIZE).metrics[Metrics.ACCURACY]\n    \n        println(\"Accuracy: $accuracy\")\n    }\n}\n```\n\n## Table of Contents\n\n- [Library Structure](#library-structure)\n- [How to configure KotlinDL in your project](#how-to-configure-kotlindl-in-your-project)\n  - [Working with KotlinDL in Android projects](#working-with-kotlindl-in-android-projects)\n  - [Working with KotlinDL in Jupyter Notebook](#working-with-kotlindl-in-jupyter-notebook)\n- [KotlinDL, ONNX Runtime, Android, and JDK versions](#kotlindl-onnx-runtime-android-and-jdk-versions)\n- [Documentation](#documentation)\n- [Examples and tutorials](#examples-and-tutorials)\n- [Running KotlinDL on GPU](#running-kotlindl-on-gpu)\n- [Logging](#logging)\n- [Fat Jar issue](#fat-jar-issue)\n- [Limitations](#limitations)\n- [Contributing](#contributing)\n- [Reporting issues/Support](#reporting-issuessupport)\n- [Code of Conduct](#code-of-conduct)\n- [License](#license)\n\n## Library Structure\n\nKotlinDL consists of several modules:\n* `kotlin-deeplearning-api` api interfaces and classes\n* `kotlin-deeplearning-impl` implementation classes and utilities\n* `kotlin-deeplearning-onnx` inference with ONNX Runtime\n* `kotlin-deeplearning-tensorflow` learning and inference with TensorFlow\n* `kotlin-deeplearning-visualization` visualization utilities\n* `kotlin-deeplearning-dataset` dataset classes\n\nModules `kotlin-deeplearning-tensorflow` and `kotlin-deeplearning-dataset` are only available for desktop JVM, while other artifacts could also be used on Android.\n\n## How to configure KotlinDL in your project\n\nTo use KotlinDL in your project, ensure that `mavenCentral` is added to the repositories list:\n```groovy\nrepositories {\n    mavenCentral()\n}\n```\nThen add the necessary dependencies to your `build.gradle` file. \n\nTo start with creating simple neural networks or downloading pre-trained models, just add the following dependency:\n```groovy\n// build.gradle\ndependencies {\n    implementation 'org.jetbrains.kotlinx:kotlin-deeplearning-tensorflow:[KOTLIN-DL-VERSION]'\n}\n```\n```kotlin\n// build.gradle.kts\ndependencies {\n    implementation (\"org.jetbrains.kotlinx:kotlin-deeplearning-tensorflow:[KOTLIN-DL-VERSION]\")\n}\n```\n\nUse `kotlin-deeplearning-onnx` module for inference with ONNX Runtime:\n```groovy\n// build.gradle\ndependencies {\n    implementation 'org.jetbrains.kotlinx:kotlin-deeplearning-onnx:[KOTLIN-DL-VERSION]'\n}\n```\n```kotlin\n// build.gradle.kts\ndependencies {\n  implementation (\"org.jetbrains.kotlinx:kotlin-deeplearning-onnx:[KOTLIN-DL-VERSION]\")\n}\n```\n\nTo use the full power of KotlinDL in your project for JVM, add the following dependencies to your `build.gradle` file:\n```groovy\n// build.gradle\ndependencies {\n    implementation 'org.jetbrains.kotlinx:kotlin-deeplearning-tensorflow:[KOTLIN-DL-VERSION]'\n    implementation 'org.jetbrains.kotlinx:kotlin-deeplearning-onnx:[KOTLIN-DL-VERSION]'\n    implementation 'org.jetbrains.kotlinx:kotlin-deeplearning-visualization:[KOTLIN-DL-VERSION]'\n}\n```\n```kotlin\n// build.gradle.kts\ndependencies {\n  implementation (\"org.jetbrains.kotlinx:kotlin-deeplearning-tensorflow:[KOTLIN-DL-VERSION]\")\n  implementation (\"org.jetbrains.kotlinx:kotlin-deeplearning-onnx:[KOTLIN-DL-VERSION]\")\n  implementation (\"org.jetbrains.kotlinx:kotlin-deeplearning-visualization:[KOTLIN-DL-VERSION]\")\n}\n```\n\nThe latest stable KotlinDL version is `0.5.2`, latest unstable version is `0.6.0-alpha-1`.\n\nFor more details, as well as for `pom.xml` and `build.gradle.kts` examples, please refer to\nthe [Quick Start Guide](docs/quick_start_guide.md).\n\n### Working with KotlinDL in Jupyter Notebook\n\nYou can work with KotlinDL interactively in Jupyter Notebook with the Kotlin kernel. To do so, add the required dependencies in your notebook: \n\n```kotlin\n@file:DependsOn(\"org.jetbrains.kotlinx:kotlin-deeplearning-tensorflow:[KOTLIN-DL-VERSION]\")\n```\nFor more details on installing Jupyter Notebook and adding the Kotlin kernel, check out the [Quick Start Guide](docs/quick_start_guide.md).\n\n### Working with KotlinDL in Android projects\n\nKotlinDL supports an inference of ONNX models on the Android platform.\nTo use KotlinDL in your Android project, add the following dependency to your build.gradle file:\n```groovy\n// build.gradle\nimplementation 'org.jetbrains.kotlinx:kotlin-deeplearning-onnx:[KOTLIN-DL-VERSION]'\n```\n```kotlin\n// build.gradle.kts\nimplementation (\"org.jetbrains.kotlinx:kotlin-deeplearning-onnx:[KOTLIN-DL-VERSION]\")\n```\nFor more details, please refer to the [Quick Start Guide](docs/quick_start_guide.md#working-with-kotlin-dl-in-android-studio).\n\n## KotlinDL, ONNX Runtime, Android, and JDK versions\n\nThis table shows the mapping between KotlinDL, TensorFlow, ONNX Runtime, Compile SDK for Android and minimum supported Java versions.\n\n| KotlinDL Version | Minimum Java Version | ONNX Runtime Version | TensorFlow Version | Android: Compile SDK Version |\n|------------------|----------------------|----------------------|--------------------|------------------------------|\n| 0.1.*            | 8                    |                      | 1.15               |                              |\n| 0.2.0            | 8                    |                      | 1.15               |                              |\n| 0.3.0            | 8                    | 1.8.1                | 1.15               |                              |\n| 0.4.0            | 8                    | 1.11.0               | 1.15               |                              |\n| 0.5.0-0.5.1      | 11                   | 1.12.1               | 1.15               | 31                           |\n| 0.5.2            | 11                   | 1.14.0               | 1.15               | 31                           |\n| 0.6.*            | 11                   | 1.16.0               | 1.15               | 31                           |\n\n## Documentation\n\n* Presentations and videos:\n  * [Deep Learning with KotlinDL](https://www.youtube.com/watch?v=jCFZc97_XQU) (Zinoviev Alexey at Huawei Developer Group HDG UK 2021, [slides](https://www.youtube.com/redirect?event=video_description\u0026redir_token=QUFFLUhqa1RPX3h0a2FrZ2pUby1kSURzYWVpM0tHNFRrUXxBQ3Jtc0tucjZMRE1JbWNuN1BrbGFMc0FOeERPVEtMR0FDLUo4bi1lcC1BcmFkMkd0WFJOS3ZVMFQ3YlctUXFHU1lVdjVZMHUzYmlETjRCZ3lLclBpZGNWcXJXcmdVLTQ5Ujd2N0hNUHlMZXRTZE1wYktHSUZuSQ\u0026q=https%3A%2F%2Fspeakerdeck.com%2Fzaleslaw%2Fdeep-learning-with-kotlindl))\n  * [Introduction to Deep Learning with KotlinDL](https://www.youtube.com/watch?v=ruUz8uMZUVw) (Zinoviev Alexey at Kotlin Budapest User Group 2021, [slides](https://speakerdeck.com/zaleslaw/deep-learning-introduction-with-kotlindl))\n* [Change log for KotlinDL](CHANGELOG.md)\n* [Full KotlinDL API reference](https://kotlin.github.io/kotlindl/)\n\n## Examples and tutorials\nYou do not need prior experience with Deep Learning to use KotlinDL.\n\nWe are working on including extensive documentation to help you get started. \nAt this point, please feel free to check out the following tutorials we have prepared:\n- [Quick Start Guide](docs/quick_start_guide.md) \n- [Creating your first neural network](docs/create_your_first_nn.md)\n- [Importing a Keras model](docs/importing_keras_model.md) \n- [Transfer learning](docs/transfer_learning.md)\n- [Transfer learning with Functional API](docs/transfer_learning_functional.md)\n- [Running inference with ONNX models on JVM](docs/inference_onnx_model.md#desktop-jvm)\n- [Running inference with ONNX models on Android](docs/inference_onnx_model.md#android)\n\nFor more inspiration, take a look at the [code examples](examples) in this repository and [Sample Android App](https://github.com/Kotlin/kotlindl-app-sample).\n\n## Running KotlinDL on GPU\n\nTo enable the training and inference on a GPU, please read this [TensorFlow GPU Support page](https://www.tensorflow.org/install/gpu)\nand install the CUDA framework to allow calculations on a GPU device.\n\nNote that only NVIDIA devices are supported.\n\nYou will also need to add the following dependencies in your project if you wish to leverage a GPU: \n```groovy\n// build.gradle\nimplementation 'org.tensorflow:libtensorflow:1.15.0'\nimplementation 'org.tensorflow:libtensorflow_jni_gpu:1.15.0'\n```\n```kotlin\n// build.gradle.kts\nimplementation (\"org.tensorflow:libtensorflow:1.15.0\")\nimplementation (\"org.tensorflow:libtensorflow_jni_gpu:1.15.0\")\n```\n\nOn Windows, the following distributions are required:\n- CUDA cuda_10.0.130_411.31_win10\n- [cudnn-7.6.3](https://developer.nvidia.com/compute/machine-learning/cudnn/secure/7.6.3.30/Production/10.0_20190822/cudnn-10.0-windows10-x64-v7.6.3.30.zip)\n- [C++ redistributable parts](https://www.microsoft.com/en-us/download/details.aspx?id=48145) \n\nFor inference of ONNX models on a CUDA device, you will also need to add the following dependencies to your project:\n```groovy\n// build.gradle\napi 'com.microsoft.onnxruntime:onnxruntime_gpu:1.16.0'\n```\n```kotlin\n// build.gradle.kts\napi(\"com.microsoft.onnxruntime:onnxruntime_gpu:1.16.0\")\n```\n\nTo find more info about ONNXRuntime and CUDA version compatibility, please refer to the [ONNXRuntime CUDA Execution Provider page](https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html).\n\n## Logging\n\nBy default, the API module uses the [kotlin-logging](https://github.com/MicroUtils/kotlin-logging) library to organize the logging process separately from the specific logger implementation.\n\nYou could use any widely known JVM logging library with a [Simple Logging Facade for Java (SLF4J)](http://www.slf4j.org/) implementation such as Logback or Log4j/Log4j2.\n\nYou will also need to add the following dependencies and configuration file ``log4j2.xml`` to the ``src/resource`` folder in your project if you wish to use log4j2:\n\n```groovy\n// build.gradle\nimplementation 'org.apache.logging.log4j:log4j-api:2.17.2'\nimplementation 'org.apache.logging.log4j:log4j-core:2.17.2'\nimplementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.2'\n```\n```kotlin\n// build.gradle.kts\nimplementation(\"org.apache.logging.log4j:log4j-api:2.17.2\")\nimplementation(\"org.apache.logging.log4j:log4j-core:2.17.2\")\nimplementation(\"org.apache.logging.log4j:log4j-slf4j-impl:2.17.2\")\n```\n\n```xml\n\u003cConfiguration status=\"WARN\"\u003e\n    \u003cAppenders\u003e\n        \u003cConsole name=\"STDOUT\" target=\"SYSTEM_OUT\"\u003e\n            \u003cPatternLayout pattern=\"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\"/\u003e\n        \u003c/Console\u003e\n    \u003c/Appenders\u003e\n\n    \u003cLoggers\u003e\n        \u003cRoot level=\"debug\"\u003e\n            \u003cAppenderRef ref=\"STDOUT\" level=\"DEBUG\"/\u003e\n        \u003c/Root\u003e\n        \u003cLogger name=\"io.jhdf\" level=\"off\" additivity=\"true\"\u003e\n            \u003cappender-ref ref=\"STDOUT\" /\u003e\n        \u003c/Logger\u003e\n    \u003c/Loggers\u003e\n\u003c/Configuration\u003e\n\n```\n\nIf you wish to use Logback, include the following dependency and configuration file ``logback.xml`` to ``src/resource`` folder in your project\n\n```groovy\n// build.gradle\nimplementation 'ch.qos.logback:logback-classic:1.4.5'\n```\n```kotlin\n// build.gradle.kts\nimplementation(\"ch.qos.logback:logback-classic:1.4.5\")\n```\n\n```xml\n\u003cconfiguration\u003e\n    \u003cappender name=\"STDOUT\" class=\"ch.qos.logback.core.ConsoleAppender\"\u003e\n        \u003cencoder\u003e\n            \u003cpattern\u003e%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n\u003c/pattern\u003e\n        \u003c/encoder\u003e\n    \u003c/appender\u003e\n\n    \u003croot level=\"info\"\u003e\n        \u003cappender-ref ref=\"STDOUT\"/\u003e\n    \u003c/root\u003e\n\u003c/configuration\u003e\n```\nThese configuration files can be found in the `examples` module.\n\n## Fat Jar issue\n\nThere is a known Stack Overflow [question](https://stackoverflow.com/questions/47477069/issue-running-tensorflow-with-java/52003343) \nand TensorFlow [issue](https://github.com/tensorflow/tensorflow/issues/30488) with Fat Jar creation and execution on Amazon EC2 instances.\n\n```\njava.lang.UnsatisfiedLinkError: /tmp/tensorflow_native_libraries-1562914806051-0/libtensorflow_jni.so: libtensorflow_framework.so.1: cannot open shared object file: No such file or directory\n```\n\nDespite the fact that the [bug](https://github.com/tensorflow/tensorflow/issues/30488) describing this problem was closed in the release of TensorFlow 1.14, \nit was not fully fixed and required an additional line in the build script.\n\nOne simple [solution](https://github.com/tensorflow/tensorflow/issues/30635#issuecomment-615513958) is to add a TensorFlow version specification to the Jar's Manifest. \nBelow is an example of a Gradle build task for Fat Jar creation.\n\n```groovy\n// build.gradle\n\ntask fatJar(type: Jar) {\n    manifest {\n        attributes 'Implementation-Version': '1.15'\n    }\n    classifier = 'all'\n    from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }\n    with jar\n}\n```\n\n```kotlin\n// build.gradle.kts\n\nplugins {\n    kotlin(\"jvm\") version \"1.5.31\"\n    id(\"com.github.johnrengelman.shadow\") version \"7.0.0\"\n}\n\ntasks{\n    shadowJar {\n        manifest {\n            attributes(Pair(\"Main-Class\", \"MainKt\"))\n            attributes(Pair(\"Implementation-Version\", \"1.15\"))\n        }\n    }\n}\n```\n\n## Limitations\n\nCurrently, only a limited set of deep learning architectures are supported. Here's the list of available layers:\n\n* Core layers:\n  - `Input`, `Dense`, `Flatten`, `Reshape`, `Dropout`, `BatchNorm`.\n* Convolutional layers:\n  - `Conv1D`, `Conv2D`, `Conv3D`;\n  - `Conv1DTranspose`, `Conv2DTranspose`, `Conv3DTranspose`;\n  - `DepthwiseConv2D`;\n  - `SeparableConv2D`.\n* Pooling layers:\n  - `MaxPool1D`, `MaxPool2D`, `MaxPooling3D`;\n  - `AvgPool1D`, `AvgPool2D`, `AvgPool3D`;\n  - `GlobalMaxPool1D`, `GlobalMaxPool2D`, `GlobalMaxPool3D`;\n  - `GlobalAvgPool1D`, `GlobalAvgPool2D`, `GlobalAvgPool3D`.\n* Merge layers:\n  - `Add`, `Subtract`, `Multiply`;\n  - `Average`, `Maximum`, `Minimum`;\n  - `Dot`;\n  - `Concatenate`.\n* Activation layers:\n  - `ELU`, `LeakyReLU`, `PReLU`, `ReLU`, `Softmax`, `ThresholdedReLU`;\n  - `ActivationLayer`.\n* Cropping layers:\n  - `Cropping1D`, `Cropping2D`, `Cropping3D`.\n* Upsampling layers:\n  - `UpSampling1D`, `UpSampling2D`, `UpSampling3D`.\n* Zero padding layers:\n  - `ZeroPadding1D`, `ZeroPadding2D`, `ZeroPadding3D`.\n* Other layers:\n  - `Permute`, `RepeatVector`.\n\nTensorFlow 1.15 Java API is currently used for layer implementation, but this project will be switching to TensorFlow 2.+ in the nearest future. \nThis, however, does not affect the high-level API. Inference with TensorFlow models is currently supported only on desktops. \n\n## Contributing\n\nRead the [Contributing Guidelines](https://github.com/Kotlin/kotlindl/blob/master/CONTRIBUTING.md).\n\n## Reporting issues/Support\n\nPlease use [GitHub issues](https://github.com/Kotlin/kotlindl/issues) for filing feature requests and bug reports. \nYou are also welcome to join the [#kotlindl channel](https://kotlinlang.slack.com/messages/kotlindl/) in Kotlin Slack.\n\n## Code of Conduct\nThis project and the corresponding community are governed by the [JetBrains Open Source and Community Code of Conduct](https://confluence.jetbrains.com/display/ALL/JetBrains+Open+Source+and+Community+Code+of+Conduct). Please make sure you read it. \n\n## License\nKotlinDL is licensed under the [Apache 2.0 License](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkotlin%2Fkotlindl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkotlin%2Fkotlindl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkotlin%2Fkotlindl/lists"}