Giter Site home page Giter Site logo

zh217 / torch-asg Goto Github PK

View Code? Open in Web Editor NEW
50.0 5.0 9.0 910 KB

Auto Segmentation Criterion (ASG) implemented in pytorch

License: GNU General Public License v3.0

Python 31.38% CMake 1.41% C++ 49.52% Cuda 17.68%
torch pytorch asg ctc seq2seq asr speech

torch-asg's Introduction

Auto Segmentation Criterion (ASG) for pytorch

This repo contains a pytorch implementation of the auto segmentation criterion (ASG), introduced in the paper Wav2Letter: an End-to-End ConvNet-based Speech Recognition System by Facebook.

As mentioned in this blog post by Daniel Galvez, ASG, being an alternative to the connectionist temporal classification (CTC) criterion widely used in deep learning, has the advantage of being a globally normalized model without the conditional independence assumption of CTC and the potential of playing better with WFST frameworks.

Unfortunately, Facebook's implementation in its official wav2letter++ project is based on the ArrayFire C++ framework, which makes experimentation rather difficult. Hence we have ported the ASG implementation in wav2letter++ to pytorch as C++ extensions.

Our implementation should produce the same result as Facebook's, but the implementation is completely different. For example, in their implementation after doing an alpha recursion during the forward pass, they just brute force the back-propagation during the backward pass, whereas we do a proper alpha-beta recursion during the forward pass, and during the backward pass there is no recursion at all. Our implementation has the benefit of much higher parallelism potential. Another difference is that we try to use pytorch's native functions as much as possible, whereas Facebook's implementation is basically a gigantic hand-written C code working on raw arrays.

In the doc folder, you can find the maths derivation of our implementation.

Project status

  • CPU (openmp) implementation
  • GPU (cuda) implementation
  • testing
  • performance tuning and comparison
  • Viterbi decoders
  • generalization to better integrate with general WFSTs decoders

Using the project

Ensure pytorch > 1.01 is installed, clone the project and in terminal do

cd torch_asg
pip install .

Tested with python 3.7.1. You need to have suitable C++ toolchain installed. For GPU, you need to have an nVidia card with compute capability >= 6.

Then in your python code:

import torch
from torch_asg import ASGLoss


def test_run():
    num_labels = 7
    input_batch_len = 6
    num_batches = 2
    target_batch_len = 5
    asg_loss = ASGLoss(num_labels=num_labels,
                       reduction='mean',  # mean (default), sum, none
                       gpu_no_stream_impl=False, # see below for explanation
                       forward_only=False # see below for explanation                      
                       )
    for i in range(1):
        # Note that inputs follows the CTC convention so that the batch dimension is 1 instead of 0,
        # in order to have a more efficient GPU implementation
        inputs = torch.randn(input_batch_len, num_batches, num_labels, requires_grad=True)
        targets = torch.randint(0, num_labels, (num_batches, target_batch_len))
        input_lengths = torch.randint(1, input_batch_len + 1, (num_batches,))
        target_lengths = torch.randint(1, target_batch_len + 1, (num_batches,))
        loss = asg_loss.forward(inputs, targets, input_lengths, target_lengths)
        print('loss', loss)
        # You can get the transition matrix if you need it.
        # transition[i, j] is transition score from label j to label i.
        print('transition matrix', asg_loss.transition)
        loss.backward()
        print('transition matrix grad', asg_loss.transition.grad)
        print('inputs grad', inputs.grad)

test_run()

There are two options for the loss constructor that warrants further explanation:

  • gpu_no_stream_impl: by default, if you are using GPU, we are using an implementation that is highly concurrent by doing some rather complicated CUDA streams manipulation. You can turn this concurrent implementation off by setting this parameter to true, and then CUDA kernel launches are serial. Useful for debugging.
  • forward_only: by default, our implementation does quite a lot of work during the forward pass concurrently that is only useful for calculating the gradients. If you don't need the gradient, setting this parameter to true will give a further speed boost. Note that the forward-only mode is automatically active when your model is in evaluation mode.

Compared to Facebook's implementation, we have also omitted scaling based on input/output lengths. If you need it, you can do it yourself by using the None reduction and scale the individual scores before summing/averaging.

torch-asg's People

Contributors

mayokaze avatar zh217 avatar

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

Watchers

 avatar  avatar  avatar  avatar  avatar

torch-asg's Issues

Error while installing

Hi, I try to install torch-asg, but there is an error "command 'gcc' failed with exit status 1" . Could you please tell me which gcc version you use, so that I can try to install using the same settings. Thanks you so much for the help and contribution.

Error for GPU version

Hi, the CPU implementation is installed successfully with gcc 6+. However, an error "nvcc fatal: Unsupported gpu architecture 'compute_75'" appeared while installing the latest GPU implementation. The working enrionment is as follows:
GPU-GTX1080Ti, CUDA-9.0, cuDNN-7.0, gcc 6+.
Could you please tell me the CUDA and cuDNN version on your machine while you are testing the GPU implementation? Thank you so much~

ERROR: Failed building wheel for torch-asg

I just clone the repo. and install the package by pip but I got the following error:

ERROR: Command errored out with exit status 1:
command: /usr/bin/python3 -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-0cn5881m/setup.py'"'"'; file='"'"'/tmp/pip-req-build-0cn5881m/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(file) if os.path.exists(file) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-f6sihhxy
cwd: /tmp/pip-req-build-0cn5881m/
Complete output (48 lines):
/home/fsuser/.local/lib/python3.6/site-packages/setuptools/dist.py:502: UserWarning: The version specified ('') is an invalid version, this may not work as expected with newer versions of setuptools, pip, and PyPI. Please see PEP 440 for more details.
"details." % version
running bdist_wheel
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.6
creating build/lib.linux-x86_64-3.6/torch_asg
copying torch_asg/init.py -> build/lib.linux-x86_64-3.6/torch_asg
copying torch_asg/asg.py -> build/lib.linux-x86_64-3.6/torch_asg
running build_ext
/home/fsuser/.local/lib/python3.6/site-packages/torch/utils/cpp_extension.py:369: UserWarning: Attempted to use ninja as the BuildExtension backend but we could not find ninja.. Falling back to using the slow distutils backend.
warnings.warn(msg.format('we could not find ninja.'))
building 'torch_asg_native' extension
creating build/temp.linux-x86_64-3.6
creating build/temp.linux-x86_64-3.6/torch_asg
creating build/temp.linux-x86_64-3.6/torch_asg/native
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/home/fsuser/.local/lib/python3.6/site-packages/torch/include -I/home/fsuser/.local/lib/python3.6/site-packages/torch/include/torch/csrc/api/include -I/home/fsuser/.local/lib/python3.6/site-packages/torch/include/TH -I/home/fsuser/.local/lib/python3.6/site-packages/torch/include/THC -I/usr/include/python3.6m -c torch_asg/native/utils.cpp -o build/temp.linux-x86_64-3.6/torch_asg/native/utils.o -O2 -DTORCH_ASG_SUPPORTS_CUDA -fopenmp -DTORCH_API_INCLUDE_EXTENSION_H -DPYBIND11_COMPILER_TYPE="_gcc" -DPYBIND11_STDLIB="_libstdcpp" -DPYBIND11_BUILD_ABI="_cxxabi1011" -DTORCH_EXTENSION_NAME=torch_asg_native -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++14
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/home/fsuser/.local/lib/python3.6/site-packages/torch/include -I/home/fsuser/.local/lib/python3.6/site-packages/torch/include/torch/csrc/api/include -I/home/fsuser/.local/lib/python3.6/site-packages/torch/include/TH -I/home/fsuser/.local/lib/python3.6/site-packages/torch/include/THC -I/usr/include/python3.6m -c torch_asg/native/force_aligned_lattice.cpp -o build/temp.linux-x86_64-3.6/torch_asg/native/force_aligned_lattice.o -O2 -DTORCH_ASG_SUPPORTS_CUDA -fopenmp -DTORCH_API_INCLUDE_EXTENSION_H -DPYBIND11_COMPILER_TYPE="_gcc" -DPYBIND11_STDLIB="_libstdcpp" -DPYBIND11_BUILD_ABI="_cxxabi1011" -DTORCH_EXTENSION_NAME=torch_asg_native -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++14
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/home/fsuser/.local/lib/python3.6/site-packages/torch/include -I/home/fsuser/.local/lib/python3.6/site-packages/torch/include/torch/csrc/api/include -I/home/fsuser/.local/lib/python3.6/site-packages/torch/include/TH -I/home/fsuser/.local/lib/python3.6/site-packages/torch/include/THC -I/usr/include/python3.6m -c torch_asg/native/fully_connected_lattice.cpp -o build/temp.linux-x86_64-3.6/torch_asg/native/fully_connected_lattice.o -O2 -DTORCH_ASG_SUPPORTS_CUDA -fopenmp -DTORCH_API_INCLUDE_EXTENSION_H -DPYBIND11_COMPILER_TYPE="_gcc" -DPYBIND11_STDLIB="_libstdcpp" -DPYBIND11_BUILD_ABI="_cxxabi1011" -DTORCH_EXTENSION_NAME=torch_asg_native -D_GLIBCXX_USE_CXX11_ABI=0 -std=c++14
torch_asg/native/fully_connected_lattice.cpp: In function ‘std::tuple<at::Tensor, at::Tensor> torch_asg::fully_connected_derivative(at::Tensor&, at::Tensor&, at::Tensor&, int64_t, int64_t, int64_t)’:
torch_asg/native/fully_connected_lattice.cpp:60:72: error: call of overloaded ‘sum()’ is ambiguous
masked_softmax(path_contrib, 3)).sum({0, 1});
^
In file included from /home/fsuser/.local/lib/python3.6/site-packages/torch/include/ATen/Tensor.h:3:0,
from /home/fsuser/.local/lib/python3.6/site-packages/torch/include/ATen/Context.h:4,
from /home/fsuser/.local/lib/python3.6/site-packages/torch/include/ATen/ATen.h:9,
from /home/fsuser/.local/lib/python3.6/site-packages/torch/include/torch/csrc/api/include/torch/types.h:3,
from /home/fsuser/.local/lib/python3.6/site-packages/torch/include/torch/csrc/api/include/torch/data/dataloader_options.h:4,
from /home/fsuser/.local/lib/python3.6/site-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/base.h:3,
from /home/fsuser/.local/lib/python3.6/site-packages/torch/include/torch/csrc/api/include/torch/data/dataloader/stateful.h:3,
from /home/fsuser/.local/lib/python3.6/site-packages/torch/include/torch/csrc/api/include/torch/data/dataloader.h:3,
from /home/fsuser/.local/lib/python3.6/site-packages/torch/include/torch/csrc/api/include/torch/data.h:3,
from /home/fsuser/.local/lib/python3.6/site-packages/torch/include/torch/csrc/api/include/torch/all.h:8,
from /home/fsuser/.local/lib/python3.6/site-packages/torch/include/torch/extension.h:4,
from torch_asg/native/utils.h:8,
from torch_asg/native/fully_connected_lattice.h:8,
from torch_asg/native/fully_connected_lattice.cpp:4:
/home/fsuser/.local/lib/python3.6/site-packages/torch/include/ATen/core/TensorBody.h:972:10: note: candidate: at::Tensor at::Tensor::sum(c10::IntArrayRef, bool, c10::optionalc10::ScalarType) const
Tensor sum(IntArrayRef dim, bool keepdim=false, c10::optional dtype=c10::nullopt) const;
^~~
/home/fsuser/.local/lib/python3.6/site-packages/torch/include/ATen/core/TensorBody.h:973:10: note: candidate: at::Tensor at::Tensor::sum(at::DimnameList, bool, c10::optionalc10::ScalarType) const
Tensor sum(DimnameList dim, bool keepdim=false, c10::optional dtype=c10::nullopt) const;
^~~
torch_asg/native/fully_connected_lattice.cpp:62:41: error: could not convert ‘{grad_transition, grad_inputs}’ from ‘’ to ‘std::tuple<at::Tensor, at::Tensor>’
return {grad_transition, grad_inputs};
^
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

ERROR: Failed building wheel for torch-asg

What is the reserved index for repetition label?

I know in warp-ctc index 0 is the reserved index for blank label. According to the FB paper, ASG uses '2' and '3' to represents repetitions. My question is what are the indexes for repetition labels in torch-asg implementation?

consumes so much gpu memory

i train an asr model, the batch size is 32, and input shape as follows:
input size: torch.Size([386, 32, 1426]) target size: torch.Size([32, 22])

the asg module try to allocate 93G memory. even i set the batch size to 2, it also out of memory.

Traceback (most recent call last):
File "/home/sid/code/masr/train.py", line 157, in
train(model)
File "/home/sid/code/masr/train.py", line 86, in train
loss = asg_loss.forward(out, y_reshape, out_lens, y_lens)
File "/home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch_asg/asg.py", line 135, in forward
target_lengths)
File "/home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch_asg/asg.py", line 77, in forward
batch_input_len, num_batches, num_labels, batch_output_len)
RuntimeError: CUDA out of memory. Tried to allocate 93.33 GiB (GPU 0; 10.92 GiB total capacity; 522.15 MiB already allocated; 9.42 GiB free; 99.85 MiB cached) (malloc at /pytorch/c10/cuda/CUDACachingAllocator.cpp:267)
frame #0: std::function<std::string ()>::operator()() const + 0x11 (0x7facd45ea441 in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch/lib/libc10.so)
frame #1: c10::Error::Error(c10::SourceLocation, std::string const&) + 0x2a (0x7facd45e9d7a in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch/lib/libc10.so)
frame #2: + 0x15bc0 (0x7fac78874bc0 in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch/lib/libc10_cuda.so)
frame #3: + 0x16247 (0x7fac78875247 in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch/lib/libc10_cuda.so)
frame #4: at::native::empty_cuda(c10::ArrayRef, c10::TensorOptions const&) + 0x121 (0x7fac875d5761 in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch/lib/libcaffe2_gpu.so)
frame #5: at::CUDAType::empty(c10::ArrayRef, c10::TensorOptions const&) const + 0x19b (0x7fac860e297b in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch/lib/libcaffe2_gpu.so)
frame #6: torch::autograd::VariableType::empty(c10::ArrayRef, c10::TensorOptions const&) const + 0x284 (0x7fac7974b094 in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch/lib/libtorch.so.1)
frame #7: at::native::zeros(c10::ArrayRef, c10::TensorOptions const&) + 0x40 (0x7fac7b1eba40 in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch/lib/libcaffe2.so)
frame #8: at::TypeDefault::zeros(c10::ArrayRef, c10::TensorOptions const&) const + 0x49 (0x7fac7b48e319 in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch/lib/libcaffe2.so)
frame #9: torch::autograd::VariableType::zeros(c10::ArrayRef, c10::TensorOptions const&) const + 0x213 (0x7fac79732603 in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch/lib/libtorch.so.1)
frame #10: torch_asg::fast_asg_gpu_forward(at::Tensor&, at::Tensor&, at::Tensor&, at::Tensor&, at::Tensor&, long, long, long, long) + 0x4ef (0x7fac627d94ef in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch_asg_native.cpython-36m-x86_64-linux-gnu.so)
frame #11: + 0x214e9 (0x7fac627d74e9 in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch_asg_native.cpython-36m-x86_64-linux-gnu.so)
frame #12: + 0x1ddb1 (0x7fac627d3db1 in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch_asg_native.cpython-36m-x86_64-linux-gnu.so)
frame #13: _PyCFunction_FastCallDict + 0x154 (0x55e57cc95744 in /home/sid/software/conda3/envs/torch/bin/python)
frame #14: + 0x19842c (0x55e57cd1c42c in /home/sid/software/conda3/envs/torch/bin/python)
frame #15: _PyEval_EvalFrameDefault + 0x30a (0x55e57cd4138a in /home/sid/software/conda3/envs/torch/bin/python)
frame #16: PyEval_EvalCodeEx + 0x329 (0x55e57cd17289 in /home/sid/software/conda3/envs/torch/bin/python)
frame #17: + 0x194094 (0x55e57cd18094 in /home/sid/software/conda3/envs/torch/bin/python)
frame #18: PyObject_Call + 0x3e (0x55e57cc9554e in /home/sid/software/conda3/envs/torch/bin/python)
frame #19: THPFunction_apply(_object*, _object*) + 0x6b1 (0x7facd4df1481 in /home/sid/software/conda3/envs/torch/lib/python3.6/site-packages/torch/lib/libtorch_python.so)
frame #20: _PyCFunction_FastCallDict + 0x91 (0x55e57cc95681 in /home/sid/software/conda3/envs/torch/bin/python)
frame #21: + 0x19842c (0x55e57cd1c42c in /home/sid/software/conda3/envs/torch/bin/python)
frame #22: _PyEval_EvalFrameDefault + 0x30a (0x55e57cd4138a in /home/sid/software/conda3/envs/torch/bin/python)
frame #23: + 0x1918e4 (0x55e57cd158e4 in /home/sid/software/conda3/envs/torch/bin/python)
frame #24: + 0x192771 (0x55e57cd16771 in /home/sid/software/conda3/envs/torch/bin/python)
frame #25: + 0x198505 (0x55e57cd1c505 in /home/sid/software/conda3/envs/torch/bin/python)
frame #26: _PyEval_EvalFrameDefault + 0x30a (0x55e57cd4138a in /home/sid/software/conda3/envs/torch/bin/python)
frame #27: + 0x1918e4 (0x55e57cd158e4 in /home/sid/software/conda3/envs/torch/bin/python)
frame #28: + 0x192771 (0x55e57cd16771 in /home/sid/software/conda3/envs/torch/bin/python)
frame #29: + 0x198505 (0x55e57cd1c505 in /home/sid/software/conda3/envs/torch/bin/python)
frame #30: _PyEval_EvalFrameDefault + 0x30a (0x55e57cd4138a in /home/sid/software/conda3/envs/torch/bin/python)
frame #31: PyEval_EvalCodeEx + 0x329 (0x55e57cd17289 in /home/sid/software/conda3/envs/torch/bin/python)
frame #32: PyEval_EvalCode + 0x1c (0x55e57cd1801c in /home/sid/software/conda3/envs/torch/bin/python)
frame #33: + 0x2163c4 (0x55e57cd9a3c4 in /home/sid/software/conda3/envs/torch/bin/python)
frame #34: PyRun_FileExFlags + 0xa1 (0x55e57cd9a7c1 in /home/sid/software/conda3/envs/torch/bin/python)
frame #35: PyRun_SimpleFileExFlags + 0x1c3 (0x55e57cd9a9c3 in /home/sid/software/conda3/envs/torch/bin/python)
frame #36: Py_Main + 0x613 (0x55e57cd9e4b3 in /home/sid/software/conda3/envs/torch/bin/python)
frame #37: main + 0xee (0x55e57cc6702e in /home/sid/software/conda3/envs/torch/bin/python)
frame #38: __libc_start_main + 0xe7 (0x7facd968ab97 in /lib/x86_64-linux-gnu/libc.so.6)
frame #39: + 0x1c3e0e (0x55e57cd47e0e in /home/sid/software/conda3/envs/torch/bin/python)

RuntimeError: cuda runtime error (77) : an illegal memory access was encountered at /opt/conda/conda-bld/pytorch_1565287148058/work/aten/src/THC/THCCachingHostAllocator.cpp:296

If I run you demo code on cuda, I get an error, but it is correct on cpu:

THCudaCheck FAIL file=/opt/conda/conda-bld/pytorch_1565287148058/work/aten/src/THC/THCCachingHostAllocator.cpp line=296 error=77 : an illegal memory access was encountered
Traceback (most recent call last):
File "", line 1, in
File "", line 18, in test_run
File "/public/home/yflv/pytorch/torch-asg/torch_asg/asg.py", line 135, in forward
target_lengths)
File "/public/home/yflv/pytorch/torch-asg/torch_asg/asg.py", line 77, in forward
batch_input_len, num_batches, num_labels, batch_output_len)
RuntimeError: cuda runtime error (77) : an illegal memory access was encountered at /opt/conda/conda-bld/pytorch_1565287148058/work/aten/src/THC/THCCachingHostAllocator.cpp:296

My test code:

import torch
from torch_asg import ASGLoss

def test_run():
num_labels = 7
input_batch_len = 6
num_batches = 2
target_batch_len = 5
asg_loss = ASGLoss(num_labels=num_labels,
reduction='mean', # mean (default), sum, none
gpu_no_stream_impl=False, # see below for explanation
forward_only=False # see below for explanation
).cuda()
for i in range(1):
# Note that inputs follows the CTC convention so that the batch dimension is 1 instead of 0,
# in order to have a more efficient GPU implementation
inputs = torch.randn(input_batch_len, num_batches, num_labels, requires_grad=True).cuda()
targets = torch.randint(0, num_labels, (num_batches, target_batch_len)).cuda()
input_lengths = torch.randint(1, input_batch_len + 1, (num_batches,))
target_lengths = torch.randint(1, target_batch_len + 1, (num_batches,))
loss = asg_loss.forward(inputs, targets, input_lengths, target_lengths)
print('loss', loss)
# You can get the transition matrix if you need it.
# transition[i, j] is transition score from label j to label i.
print('transition matrix', asg_loss.transition)
loss.backward()
print('transition matrix grad', asg_loss.transition.grad)
print('inputs grad', inputs.grad)

test_run()

my environment:
centos 7.2
Python 3.6.5 :: Anaconda, Inc.
pytorch 1.2.0
cuda9.2.148
cudnn7.1.4

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.