Git Product home page Git Product logo

jpmml-tensorflow's Introduction

JPMML-TensorFlow

Java library and command-line application for converting TensorFlow models to PMML.

Features

Prerequisites

The TensorFlow side of operations

  • Protocol Buffers 3.2.0 or newer
  • TensorFlow 1.1.0 or newer

The Java side of operations

  • Java 1.8 or newer

Installation

Enter the project root directory and build using Apache Maven; use the protoc.exe system property to specify the location of the Protocol Buffers compiler:

mvn -Dprotoc.exe=/usr/local/bin/protoc clean install

The build produces an executable uber-JAR file target/converter-executable-1.0-SNAPSHOT.jar.

Usage

A typical workflow can be summarized as follows:

  1. Use TensorFlow to train an estimator.
  2. Export the estimator in SavedModel data format to a directory in a local filesystem.
  3. Use the JPMML-TensorFlow command-line converter application to turn the SavedModel directory to a PMML file.

The TensorFlow side of operations

Please see the test script file main.py for sample workflows.

The Java side of operations

Converting the estimator SavedModel directory estimator/ to a PMML file estimator.pmml:

java -jar target/converter-executable-1.0-SNAPSHOT.jar --tf-savedmodel-input estimator/ --pmml-output estimator.pmml

Getting help:

java -jar target/converter-executable-1.0-SNAPSHOT.jar --help

License

JPMML-TensorFlow is licensed under the GNU Affero General Public License (AGPL) version 3.0. Other licenses are available on request.

Additional information

Please contact [email protected]

jpmml-tensorflow's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jpmml-tensorflow's Issues

IllegalArgumentException in org.jpmml.tensorflow.EstimatorFactory

Hi @vruusmann ,

I have a tensorflow model which needs to be converted to a pmml. Once I tried that, an exception has thrown. The log is shown below.

INFO: Parsing SavedModel..
2018-07-13 12:28:56.752157: I tensorflow/cc/saved_model/loader.cc:242] Loading SavedModel with tags: { serve }; from: /Users/usewwandi/Desktop/model-9000
2018-07-13 12:28:56.760847: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.2 AVX AVX2 FMA
2018-07-13 12:28:56.776248: I tensorflow/cc/saved_model/loader.cc:161] Restoring SavedModel bundle.
2018-07-13 12:29:01.599559: I tensorflow/cc/saved_model/loader.cc:196] Running LegacyInitOp on SavedModel bundle.
2018-07-13 12:29:01.610202: I tensorflow/cc/saved_model/loader.cc:291] SavedModel load for tags { serve }; Status: success. Took 4858059 microseconds.
Jul 13, 2018 12:29:01 PM org.jpmml.tensorflow.Main run
INFO: Parsed SavedModel in 5639 ms.
Jul 13, 2018 12:29:02 PM org.jpmml.tensorflow.Main run
INFO: Converting..
Jul 13, 2018 12:29:02 PM org.jpmml.tensorflow.Main run
SEVERE: Failed to convert
java.lang.IllegalArgumentException
at org.jpmml.tensorflow.EstimatorFactory.newEstimator(EstimatorFactory.java:58)
at org.jpmml.tensorflow.Main.run(Main.java:117)
at org.jpmml.tensorflow.Main.main(Main.java:90)

Exception in thread "main" java.lang.IllegalArgumentException
at org.jpmml.tensorflow.EstimatorFactory.newEstimator(EstimatorFactory.java:58)
at org.jpmml.tensorflow.Main.run(Main.java:117)
at org.jpmml.tensorflow.Main.main(Main.java:90)

My model has a variables directory and saved_model.pb file. Variables directory has two "variables.data-00000-of-00002" files and "variables.index" file. Is the model incorrect here?

Thank you.

pmml export from tf.estimator models

I built a model with tf.estimator API (dnn and linear). I can load it up on python serving by doing the following steps:

import tensorflow as tf
from tensorflow.python.saved_model.tag_constants import tag_constants
with tf.Session(graph=tf.Graph()) as sess:
  tf.saved_model.loader.load(sess, [tag_constants.TRAINING], export_dir)

with jpmml-tensorflow I am getting a factory issue:

cmle-env) debasish:jpmml-tensorflow debasish.das$ java -jar target/converter-executable-1.0-SNAPSHOT.jar --tf-savedmodel-input dnn/ --pmml-output dnn.pmml
Mar 22, 2018 5:30:25 PM org.jpmml.tensorflow.Main run
INFO: Parsing SavedModel..
2018-03-22 17:30:25.707794: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.2 AVX AVX2 FMA
2018-03-22 17:30:25.708049: I tensorflow/cc/saved_model/loader.cc:242] Loading SavedModel with tags: { serve }; from: /Users/debasish.das/creditkarma/jpmml-tensorflow/dnn
2018-03-22 17:30:25.802902: I tensorflow/cc/saved_model/loader.cc:161] Restoring SavedModel bundle.
2018-03-22 17:30:25.841061: I tensorflow/cc/saved_model/loader.cc:196] Running LegacyInitOp on SavedModel bundle.
2018-03-22 17:30:25.890051: I tensorflow/cc/saved_model/loader.cc:291] SavedModel load for tags { serve }; Status: success. Took 182028 microseconds.
Mar 22, 2018 5:30:26 PM org.jpmml.tensorflow.Main run
INFO: Parsed SavedModel in 705 ms.
Mar 22, 2018 5:30:26 PM org.jpmml.tensorflow.Main run
INFO: Converting..
Mar 22, 2018 5:30:26 PM org.jpmml.tensorflow.Main run
SEVERE: Failed to convert
java.lang.IllegalArgumentException
	at org.jpmml.tensorflow.EstimatorFactory.newEstimator(EstimatorFactory.java:58)
	at org.jpmml.tensorflow.Main.run(Main.java:117)
	at org.jpmml.tensorflow.Main.main(Main.java:90)

Exception in thread "main" java.lang.IllegalArgumentException
	at org.jpmml.tensorflow.EstimatorFactory.newEstimator(EstimatorFactory.java:58)
	at org.jpmml.tensorflow.Main.run(Main.java:117)
	at org.jpmml.tensorflow.Main.main(Main.java:90)

Do I need to add a new Estimator for the tf.estimator models ?

tensorflow convert the pmml exception

root@main:/opt# java -jar converter-executable-1.0-SNAPSHOT.jar --tf-savedmodel-input model/ --pmml-output estimator.pmml
Mar 12, 2018 9:35:02 AM org.jpmml.tensorflow.Main run
INFO: Parsing SavedModel..
2018-03-12 09:35:02.866322: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2018-03-12 09:35:02.866705: I tensorflow/cc/saved_model/loader.cc:289] SavedModel load for tags { serve }; Status: fail. Took 24 microseconds.
Mar 12, 2018 9:35:02 AM org.jpmml.tensorflow.Main run
SEVERE: Failed to parse SavedModel
org.tensorflow.TensorFlowException: SavedModel not found in export directory: /opt/model
	at org.tensorflow.SavedModelBundle.load(Native Method)
	at org.tensorflow.SavedModelBundle.load(SavedModelBundle.java:39)
	at org.jpmml.tensorflow.Main.run(Main.java:100)
	at org.jpmml.tensorflow.Main.main(Main.java:90)

Exception in thread "main" org.tensorflow.TensorFlowException: SavedModel not found in export directory: /opt/model
	at org.tensorflow.SavedModelBundle.load(Native Method)
	at org.tensorflow.SavedModelBundle.load(SavedModelBundle.java:39)
	at org.jpmml.tensorflow.Main.run(Main.java:100)
	at org.jpmml.tensorflow.Main.main(Main.java:90)

my os system is ubuntu 16.04

root@main:/opt/model# pwd
/opt/model
root@main:/opt/model# ls
checkpoint                             mnist_model-26001.data-00000-of-00001  mnist_model-27001.index                mnist_model-28001.meta
mnist_model-25001.data-00000-of-00001  mnist_model-26001.index                mnist_model-27001.meta                 mnist_model-29001.data-00000-of-00001
mnist_model-25001.index                mnist_model-26001.meta                 mnist_model-28001.data-00000-of-00001  mnist_model-29001.index
mnist_model-25001.meta                 mnist_model-27001.data-00000-of-00001  mnist_model-28001.index                mnist_model-29001.meta
root@main:/opt/model# 

jpmml-tensorflow mvn clean package exception

[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /opt/jpmml-tensorflow/src/main/java/org/jpmml/tensorflow/SavedModel.java:[136,50] incompatible types: java.util.List<org.tensorflow.Tensor<?>> cannot be converted to java.util.List<org.tensorflow.Tensor>
[INFO] 1 error
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.203 s
[INFO] Finished at: 2018-03-01T18:00:01+08:00
[INFO] Final Memory: 21M/61M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.5.1:compile (default-compile) on project jpmml-tensorflow: Compilation failure
[ERROR] /opt/jpmml-tensorflow/src/main/java/org/jpmml/tensorflow/SavedModel.java:[136,50] incompatible types: java.util.List<org.tensorflow.Tensor<?>> cannot be converted to java.util.List<org.tensorflow.Tensor>
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

SEVERE: Failed to convert (IllegalArgumentException)

Hi @vruusmann,

I wish to convert my contrib.learn.DNNClassifier estimator to PMML, but came across:

SEVERE: Failed to convert
java.lang.IllegalArgumentException
	at org.jpmml.tensorflow.DNNEstimator.encodeNeuralNetwork(DNNEstimator.java:77)
	at org.jpmml.tensorflow.DNNClassifier.encodeModel(DNNClassifier.java:50)
	at org.jpmml.tensorflow.DNNClassifier.encodeModel(DNNClassifier.java:40)
	at org.jpmml.tensorflow.Estimator.encodePMML(Estimator.java:43)
	at org.jpmml.tensorflow.Main.run(Main.java:120)
	at org.jpmml.tensorflow.Main.main(Main.java:90)

Exception in thread "main" java.lang.IllegalArgumentException
	at org.jpmml.tensorflow.DNNEstimator.encodeNeuralNetwork(DNNEstimator.java:77)
	at org.jpmml.tensorflow.DNNClassifier.encodeModel(DNNClassifier.java:50)
	at org.jpmml.tensorflow.DNNClassifier.encodeModel(DNNClassifier.java:40)
	at org.jpmml.tensorflow.Estimator.encodePMML(Estimator.java:43)
	at org.jpmml.tensorflow.Main.run(Main.java:120)
	at org.jpmml.tensorflow.Main.main(Main.java:90)

I was trying to look into this, and the println of NodeDef concat looks like:

name: "dnn/input_from_feature_columns/input_from_feature_columns/concat"
op: "Identity"
input: "ParseExample/ParseExample"
attr {
  key: "T"
  value {
    type: DT_FLOAT
  }
}
attr {
  key: "_output_shapes"
  value {
    list {
      shape {
        dim {
          size: -1
        }
        dim {
          size: 119
        }
      }
    }
  }

seems like a structure conflict? And I was using TF v1.5.

@vruusmann Is this normal behavior? Or any clue how I can fix this?

Thanks very much for sharing us this tool !!! ๐Ÿ‘ ๐Ÿ’ฏ

tensorflow 1.6 + protoc 3.5.1 compilation

I am getting compilation errors:

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /Users/debasish.das/creditkarma/jpmml-tensorflow/src/main/java/org/jpmml/tensorflow/SavedModel.java:[136,50] incompatible types: java.util.List<org.tensorflow.Tensor<?>> cannot be converted to java.util.List<org.tensorflow.Tensor>
[ERROR] /Users/debasish.das/creditkarma/jpmml-tensorflow/target/generated-sources/protobuf/java/org/tensorflow/framework/MetaGraphDef.java:[63,18] cannot find symbol
symbol: method parseUnknownFieldProto3(com.google.protobuf.CodedInputStream,com.google.protobuf.UnknownFieldSet.Builder,com.google.protobuf.ExtensionRegistryLite,int)
location: class org.tensorflow.framework.MetaGraphDef

Does the library depend on specific version of tensorflow and protoc ?

tensorflow convert the pmml exception

root@main:/opt# java -jar converter-executable-1.0-SNAPSHOT.jar --tf-savedmodel-input model/ --pmml-output estimator.pmml
Mar 12, 2018 9:35:02 AM org.jpmml.tensorflow.Main run
INFO: Parsing SavedModel..
2018-03-12 09:35:02.866322: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2018-03-12 09:35:02.866705: I tensorflow/cc/saved_model/loader.cc:289] SavedModel load for tags { serve }; Status: fail. Took 24 microseconds.
Mar 12, 2018 9:35:02 AM org.jpmml.tensorflow.Main run
SEVERE: Failed to parse SavedModel
org.tensorflow.TensorFlowException: SavedModel not found in export directory: /opt/model
	at org.tensorflow.SavedModelBundle.load(Native Method)
	at org.tensorflow.SavedModelBundle.load(SavedModelBundle.java:39)
	at org.jpmml.tensorflow.Main.run(Main.java:100)
	at org.jpmml.tensorflow.Main.main(Main.java:90)

Exception in thread "main" org.tensorflow.TensorFlowException: SavedModel not found in export directory: /opt/model
	at org.tensorflow.SavedModelBundle.load(Native Method)
	at org.tensorflow.SavedModelBundle.load(SavedModelBundle.java:39)
	at org.jpmml.tensorflow.Main.run(Main.java:100)
	at org.jpmml.tensorflow.Main.main(Main.java:90)

IllegalArgumentException at org.jpmml.tensorflow.EstimatorFactory.newEstimator

Dear Villu,
With-
protobuf 3.7.1
tensorflow 1.13.1
openjdk 1.8.0_212
I'm doing
$ java -jar target/converter-executable-1.0-SNAPSHOT.jar --tf-savedmodel-input 1554735764/ --pmml-output estimator.pmml
to the following error:

Apr 09, 2019 1:39:36 PM org.jpmml.tensorflow.Main run
INFO: Parsing SavedModel..
2019-04-09 13:39:38.108054: I tensorflow/cc/saved_model/reader.cc:31] Reading SavedModel from: /home/cstrait_gcp2/1554735764
2019-04-09 13:39:38.144966: I tensorflow/cc/saved_model/reader.cc:54] Reading meta graph with tags { serve }
2019-04-09 13:39:38.150964: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2019-04-09 13:39:38.221977: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2300000000 Hz
2019-04-09 13:39:38.222114: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x7ff2d4d0c8b0 executing computations on platform Host. Devices:
2019-04-09 13:39:38.222125: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (0): <undefined>, <undefined>
2019-04-09 13:39:38.243759: I tensorflow/cc/saved_model/loader.cc:182] Restoring SavedModel bundle.
2019-04-09 13:39:38.431421: I tensorflow/cc/saved_model/loader.cc:132] Running initialization op on SavedModel bundle.
2019-04-09 13:39:38.463896: I tensorflow/cc/saved_model/loader.cc:285] SavedModel load for tags { serve }; Status: success. Took 355847 microseconds.
Apr 09, 2019 1:39:38 PM org.jpmml.tensorflow.Main run
INFO: Parsed SavedModel in 1622 ms.
Apr 09, 2019 1:39:39 PM org.jpmml.tensorflow.Main run
INFO: Converting..
Apr 09, 2019 1:39:39 PM org.jpmml.tensorflow.Main run
SEVERE: Failed to convert
java.lang.IllegalArgumentException
        at org.jpmml.tensorflow.EstimatorFactory.newEstimator(EstimatorFactory.java:58)
        at org.jpmml.tensorflow.Main.run(Main.java:117)
        at org.jpmml.tensorflow.Main.main(Main.java:90)

Exception in thread "main" java.lang.IllegalArgumentException
        at org.jpmml.tensorflow.EstimatorFactory.newEstimator(EstimatorFactory.java:58)
        at org.jpmml.tensorflow.Main.run(Main.java:117)
        at org.jpmml.tensorflow.Main.main(Main.java:90)

I'd truly appreciate any assistance in you can offer in debugging this, which I suspect is a versions-related issue.
Regards,
Caleb

Compile error at jpmml-tensorflow installation on methods parseUnknownFieldProto3 and setUnknownFieldsProto3

I am installing jpmml-tensorflow using ubuntu 16.04, protobuf 3.5.1, tensorflow 1.7.0, jdk 1.8.0_171 (oracle), maven 3.3.9. The following command line is used:

mvn -X -Dprotoc.exe=/usr/local/bin/protoc clean install

The installation failed with compile errors on the methods parseUnknownFieldProto3 and setUnknownFieldsProto3. It is the same error message as if we drop the -Dprotoc.exe=/usr/local/bin/protoc option. I double-check that the protoc is at the right location:

yuan@yuan-VirtualBox:$ protoc --version
libprotoc 3.5.1
yuan@yuan-VirtualBox:$ whereis protoc
protoc: /usr/local/bin/protoc

And I have tried 1) clearing the ~/.m2 directory and reinstall; 2) installing in windows 7 with protobuf win32 binary. They did not help. Any direction pointing will be appreciated.

The complete log is as follows.

install.log

And also the default pom.xml file:

pom.xml.log

Cannot compile jar

Hi,
I tried to compile on my windows and my Linux server but I have the argument mismatch issue. I use win32 version or protocol buffer 3.3.0. Can anyone help to get me the compiled file please?

Thank you.

Converter exception on saveModel generated by tensorflow1.9.0

Hi,

Looks I meet an issue during converting the saveModel which is generated by tensorflow 1.9.0 (all 1.9.0 to 1.3.0 do not work, only 1.2.0 works) to pmml file.
I take the main.py supplied in this project and run this on different tensorflow versions, but only 1.2.0 works, all higher versions cause exceptions during converting to pmml file by jpmml-tensorflow, as follows,

java -jar target/converter-executable-1.0-SNAPSHOT.jar --tf-savedmodel-input LinearRegressionAuto --pmml-output LinearRegressionAuto.pmml
Jul 24, 2018 10:56:32 AM org.jpmml.tensorflow.Main run
INFO: Parsing SavedModel..
2018-07-24 10:56:33.899625: I tensorflow/cc/saved_model/loader.cc:242] Loading SavedModel with tags: { serve }; from: /home/tensorflow/savedmodel/LinearRegressionAuto
2018-07-24 10:56:33.917491: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2018-07-24 10:56:33.924418: I tensorflow/cc/saved_model/loader.cc:161] Restoring SavedModel bundle.
2018-07-24 10:56:33.932744: I tensorflow/cc/saved_model/loader.cc:196] Running LegacyInitOp on SavedModel bundle.
2018-07-24 10:56:33.949825: I tensorflow/cc/saved_model/loader.cc:291] SavedModel load for tags { serve }; Status: success. Took 50275 microseconds.
Jul 24, 2018 10:56:33 AM org.jpmml.tensorflow.Main run
INFO: Parsed SavedModel in 961 ms.
Jul 24, 2018 10:56:34 AM org.jpmml.tensorflow.Main run
INFO: Converting..
Jul 24, 2018 10:56:34 AM org.jpmml.tensorflow.Main run
SEVERE: Failed to convert
java.util.NoSuchElementException
	at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:721)
	at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:742)
	at com.google.common.collect.Iterators.getOnlyElement(Iterators.java:308)
	at com.google.common.collect.Iterables.getOnlyElement(Iterables.java:294)
	at org.jpmml.tensorflow.SavedModel.getOnlyInput(SavedModel.java:176)
	at org.jpmml.tensorflow.LinearEstimator.encodeRegressionModel(LinearEstimator.java:100)
	at org.jpmml.tensorflow.LinearRegressor.encodeModel(LinearRegressor.java:43)
	at org.jpmml.tensorflow.LinearRegressor.encodeModel(LinearRegressor.java:31)
	at org.jpmml.tensorflow.Estimator.encodePMML(Estimator.java:43)
	at org.jpmml.tensorflow.Main.run(Main.java:120)
	at org.jpmml.tensorflow.Main.main(Main.java:90)

Exception in thread "main" java.util.NoSuchElementException
	at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:721)
	at java.util.LinkedHashMap$LinkedKeyIterator.next(LinkedHashMap.java:742)
	at com.google.common.collect.Iterators.getOnlyElement(Iterators.java:308)
	at com.google.common.collect.Iterables.getOnlyElement(Iterables.java:294)
	at org.jpmml.tensorflow.SavedModel.getOnlyInput(SavedModel.java:176)
	at org.jpmml.tensorflow.LinearEstimator.encodeRegressionModel(LinearEstimator.java:100)
	at org.jpmml.tensorflow.LinearRegressor.encodeModel(LinearRegressor.java:43)
	at org.jpmml.tensorflow.LinearRegressor.encodeModel(LinearRegressor.java:31)
	at org.jpmml.tensorflow.Estimator.encodePMML(Estimator.java:43)
	at org.jpmml.tensorflow.Main.run(Main.java:120)
	at org.jpmml.tensorflow.Main.main(Main.java:90)

I also tried tensorflow1.9.0 of python3.6, same exception happens.
Not sure what happens and what's wrong i did during compling jpmml-tensorflow binary (same steps for tensorflow1.2.0 works).

Anyone met this issue before?
Thanks for your help.

RL

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.