Giter Site home page Giter Site logo

ajtulloch / dnngraph Goto Github PK

View Code? Open in Web Editor NEW
697.0 40.0 59.0 512 KB

A DSL for deep neural networks, supporting Caffe and Torch

Home Page: http://ajtulloch.github.io/dnngraph

License: Other

Haskell 51.52% Lua 0.08% Python 0.63% Protocol Buffer 47.33% Shell 0.45%

dnngraph's Introduction

DNNGraph - A deep neural network model generation DSL in Haskell

It consists of several parts:

  • A DSL for specifying the model. This uses the lens library for elegant, composable constructions, and the fgl graph library for specifying the network layout.
  • A set of optimization passes that run over the graph representation to improve the performance of the model. For example, we can take advantage of the fact that several layers types (ReLU, Dropout) can operate in-place.
  • A set of backends to generate code for the platform. Currently, we generate
    • Caffe (by generating model prototxt files)
    • Torch (by generating Lua scripts)
  • A set of useful CLI tools for exporting, visualizing and understanding a model (visualization of network structure, parameter density)

For a guided example, see a demonstration IHaskell Notebook.

Building

Make sure that you have Python 2 and protoc from Protocol Buffers installed. Then run

$ cabal install hprotoc
$ ./lens_proto.sh # generate code from protocol buffers
$ cabal install

DSL Examples

The following script generates a replica of https://github.com/BVLC/caffe/blob/master/models/bvlc_alexnet/train_val.prototxt.

AlexNet

import           Control.Lens
import           Control.Monad

import           NN.DSL
import           NN.Examples.ImageNet
import           NN.Graph

alexTrain = train & cropSize' 227 & batchSize' 256 & mirror' True
alexTest = test & cropSize' 227 & batchSize' 50 & mirror' False

alexLrn = lrn & localSize' 5 & alphaLRN' 0.0001 & betaLRN' 0.75
alexConv = conv & param' alexMult & weightFillerC' (gaussian 0.01) & biasFillerC' zero
alexIP n = ip n & param' alexMult & weightFillerIP' (gaussian 0.005) & biasFillerIP' (constant 0.1)
alexPool = maxPool & sizeP' 3

alexMult = [def & lrMult' 1 & decayMult' 1, -- weights
            def & lrMult' 2 & decayMult' 0] -- biases

-- |Model
conv1 = alexConv & numOutputC' 96 & kernelSizeC' 11 & strideC' 4
conv2 = alexConv & numOutputC' 256 & padC' 2 & kernelSizeC' 5 & groupC' 2
conv3 = alexConv & numOutputC' 384 & padC' 1 & kernelSizeC' 3
conv4 = alexConv & numOutputC' 384 & padC' 1 & kernelSizeC' 3 & groupC' 2 & biasFillerC' (constant 0.1)
conv5 = alexConv & numOutputC' 256 & padC' 1 & kernelSizeC' 3 & groupC' 2 & biasFillerC' (constant 0.1)

alexNet = do
  -- Set up the model
  (input', representation) <-
      sequential [
           -- Convolutional Layers
           conv1, relu, alexLrn, alexPool & strideP' 3,
           conv2, relu, alexLrn, alexPool & strideP' 2,
           conv3, relu,
           conv4, relu,
           conv5, relu, alexPool & strideP' 2,
           -- FC Layers
           alexIP 4096, relu, dropout 0.5,
           alexIP 4096, relu, dropout 0.5,
           alexIP 1000 & weightFillerIP' (gaussian 0.01) & biasFillerIP' zero]

  forM_ [alexTrain, alexTest] $ attach (To input')
  forM_ [accuracy 1, accuracy 5, softmax] $ attach (From representation)

or visually, using NN.Visualize,

http://i.imgur.com/1hKlPdA.png

GoogLeNet

The following script generates a replica of https://github.com/BVLC/caffe/blob/master/models/bvlc_googlenet/train_val.prototxt

module NN.Examples.GoogLeNet where

import           Gen.Caffe.FillerParameter       as FP
import           Gen.Caffe.InnerProductParameter as IP
import           Gen.Caffe.LayerParameter        as LP

import           Control.Lens
import           Control.Monad
import           Data.Sequence                   (singleton)
import           Data.Word

import           NN
import           NN.Examples.ImageNet


googleTrain = train & mirror' True & batchSize' 32 & cropSize' 224
googleTest = test & mirror' False & batchSize' 50 & cropSize' 224

googleMult = [def & lrMult' 1 & decayMult' 1, -- weights
              def & lrMult' 2 & decayMult' 0] -- biases
googleConv = conv & param' googleMult & biasFillerC' (constant 0.2)
googleLRN = lrn & localSize' 5 & alphaLRN' 0.0001 & betaLRN' 0.75
googlePool = maxPool & sizeP' 3 & strideP' 2
googleIP n = ip n & param' googleMult

conv1 = googleConv & numOutputC' 64 & padC' 3 & kernelSizeC' 7 & strideC' 2 & weightFillerC' (xavier 0.1)
conv2 = googleConv & numOutputC' 192 & padC' 1 & kernelSizeC' 3 & weightFillerC' (xavier 0.03)

topPool = avgPool & sizeP' 7 & strideP' 1
topFc = googleIP 1000 & biasFillerIP' (constant 0) & weightFillerIP' (xavier 0.0)
        -- Weird, but in Caffe replication
        & _inner_product_param._Just.IP._weight_filler._Just._std .~ Nothing

data Inception = Inception {_1x1, _3x3reduce, _3x3, _5x5reduce, _5x5, _poolProj :: Word32}

inception :: Node -> Inception -> NetBuilder Node
inception input Inception{..} = do
  columns' <- mapM sequential columns
  concat'' <- layer' concat'
  forM_ columns' $ \(bottom, top) -> do
                                  input >-> bottom
                                  top >-> concat''
  return concat''
    where
      columns = [
       [googleConv & numOutputC' _1x1  & kernelSizeC' 1 & weightFillerC' (xavier 0.03), relu],
       [googleConv & numOutputC' _3x3reduce & kernelSizeC' 1 & weightFillerC' (xavier 0.09), relu, googleConv & numOutputC' _3x3 & kernelSizeC' 3 & weightFillerC' (xavier 0.03) & padC' 1, relu],
       [googleConv & numOutputC' _5x5reduce & kernelSizeC' 1 & weightFillerC' (xavier 0.2), relu, googleConv & numOutputC' _5x5 & kernelSizeC' 5 & weightFillerC' (xavier 0.03) & padC' 2, relu],
       [maxPool& sizeP' 3 & strideP' 3 & padP' 1, googleConv & numOutputC' _poolProj & kernelSizeC' 1 & weightFillerC' (xavier 0.1), relu]]

intermediateClassifier :: Node -> NetBuilder ()
intermediateClassifier source = do
  (input, representation) <- sequential [pool1, conv1', relu, fc1, relu, dropout 0.7, fc2]
  source >-> input

  forM_ [accuracy 1, accuracy 5, softmax & _loss_weight <>~ singleton 0.3] $ attach (From representation)
    where
      pool1 = avgPool & sizeP' 5 & strideP' 3
      conv1' = googleConv & numOutputC' 128 & kernelSizeC' 1 & weightFillerC' (xavier 0.08)
      fc1 = googleIP 1024 & weightFillerIP' (xavier 0.02) & biasFillerIP' (constant 0.2)
      fc2 = googleIP 1000 & weightFillerIP' (xavier 0.0009765625) & biasFillerIP' (constant 0)

-- What to do at each row in the inner column?
data Row = I Inception | Classifier | MaxPool

insertRow :: Node -> Row -> NetBuilder Node
insertRow input (I inceptor) = inception input inceptor
insertRow input Classifier = do
  intermediateClassifier input
  return input
insertRow input MaxPool = do
  node <- layer' googlePool
  input >-> node
  return node

googLeNet :: NetBuilder ()
googLeNet = do
  (input, initial) <- sequential [conv1, relu, googlePool, googleLRN, conv2, relu, googleLRN, googlePool]

  top <- foldM insertRow initial [
             I $ Inception 64 96 128 16 32 32,
             I $ Inception 128 128 192 32 96 64,
             MaxPool,
             I $ Inception 192 96 208 16 48 64,
             Classifier,
             I $ Inception 150 112 224 24 64 64,
             I $ Inception 128 128 256 24 64 64,
             I $ Inception 112 144 288 32 64 64,
             Classifier,
             I $ Inception 256 160 320 32 128 128,
             MaxPool,
             I $ Inception 256 160 320 32 128 128,
             I $ Inception 384 192 384 48 128 128]

  (_, representation) <- with top >- sequential [topPool, dropout 0.4, topFc]

  forM_ [accuracy 1, accuracy 5, softmax] $ attach (From representation)
  forM_ [googleTrain, googleTest] $ attach (To input)

main :: IO ()
main = cli googLeNet

CLI Usage

In the GoogLeNet example, above, we included the line main = cli googLeNet. This generates a CLI for our model that can be accessed with runhaskell /path/to/our/model.hs. Currently, we can

  • export to Caffe
  • export to Torch
  • visualize the network structure.

For example:

$ runhaskell NN/Examples/GoogLeNet.hs --help
Usage: GoogLeNet.hs COMMAND

Available options:
  -h,--help                Show this help text

Available commands:
  caffe                    Generate a Caffe .prototxt to run with `caffe train
                           --model=<>
  torch                    Generate Lua code to be `require`'d into an existing
                           Torch script
  visualize                Generate an image visualizing the model's connectivity

$ runhaskell NN/Examples/GoogLeNet.hs caffe --output /tmp/x.prototxt
$ runhaskell NN/Examples/GoogLeNet.hs visualize --format pdf --output /tmp/x.pdf

Caffe Backend

The Caffe backend generates a Caffe .prototxt that can be run with caffe train --model=<>, without any modification necessary.

Torch Backend

The Torch backend generates Lua code that can be imported directly into an existing Torch script.

Anything network that can be expressed as a nested combination of computational layers, combined with nn.Sequential, nn.Concat, nn.ModelParallel, nn.DataParallel etc can be generated under this framework.

For an example output, the model specified as

alexTrain = train & cropSize' 227 & batchSize' 256 & mirror' True
alexTest = test & cropSize' 227 & batchSize' 50 & mirror' False

alexConv = conv & param' alexMult & weightFillerC' (gaussian 0.01) & biasFillerC' zero
alexPool = maxPool & sizeP' 3

conv1 = alexConv & numOutputC' 96 & kernelSizeC' 11 & strideC' 4
pool1 = alexPool & strideP' 3

model = do
  (input', representation) <- sequential [conv1, relu, pool1]
  forM_ [alexTrain, alexTest] $ attach (To input')
  forM_ [accuracy 1, accuracy 5, softmax] $ attach (From representation)

generates the following code:

require("nn")
require("cunn")
local seq0 = nn.Sequential()
seq0:add(nn.SpatialConvolutionMM(nil, 96, 11, 11, 4, 4, 0))
seq0:add(nn.Threshold())
seq0:add(nn.SpatialMaxPooling(3, 3, 3, 3))
seq0:add(nn.LogSoftMax())
local criterion1 = nn.ClassNLLCriterion()
return seq0, criterion1

For a more complicated example, the network specified as

do
  x <- layer' relu
  (_, y) <- with x >- sequential [conv, relu, maxPool, conv, relu]
  (_, z) <- with x >- sequential [conv, relu, maxPool, conv, relu]
  concat'' <- layer' concat'

  y >-> concat''
  z >-> concat''
  _ <- with concat'' >- sequential [ip 4096, relu, dropout 0.5, ip 1000, softmax]
  return ()

that looks like

http://i.imgur.com/dsqgYna.png

will generate

require("nn")
local seq0 = nn.Sequential()
local mod1 = nn.Threshold()
seq0:add(mod1)
local concat2 = nn.DepthConcat()
local seq3 = nn.Sequential()
local mod4 = nn.SpatialConvolutionMM(nil, nil, nil, nil, 1, 1, 0)
seq3:add(mod4)
local mod5 = nn.Threshold()
seq3:add(mod5)
local mod6 = nn.SpatialMaxPooling(nil, nil, 1, 1)
seq3:add(mod6)
local mod7 = nn.SpatialConvolutionMM(nil, nil, nil, nil, 1, 1, 0)
seq3:add(mod7)
local mod8 = nn.Threshold()
seq3:add(mod8)
concat2:add(seq3)
local seq9 = nn.Sequential()
local mod10 = nn.SpatialConvolutionMM(nil, nil, nil, nil, 1, 1, 0)
seq9:add(mod10)
local mod11 = nn.Threshold()
seq9:add(mod11)
local mod12 = nn.SpatialMaxPooling(nil, nil, 1, 1)
seq9:add(mod12)
local mod13 = nn.SpatialConvolutionMM(nil, nil, nil, nil, 1, 1, 0)
seq9:add(mod13)
local mod14 = nn.Threshold()
seq9:add(mod14)
concat2:add(seq9)
seq0:add(concat2)
local mod15 = nn.Linear(nil, 4096)
seq0:add(mod15)
local mod16 = nn.Threshold()
seq0:add(mod16)
local mod17 = nn.Dropout(0.5)
seq0:add(mod17)
local mod18 = nn.Linear(nil, 1000)
seq0:add(mod18)
local mod19 = nn.LogSoftMax()
seq0:add(mod19)
local criteria20 = nn.ClassNLLCriterion()
return seq0, criteria20

Visualization Examples

The NN.Visualize module provides some plotting tools. To use these,

import NN.Visualize

visualize :: Net -> DotGraph Node
png :: FilePath -> DotGraph Node -> IO FilePath

-- For example, to visualize GoogLeNet to a file
file :: FilePath
(frontend googLeNet & visualize & png file) :: IO FilePath

An example output is (click for higher resolution):

http://i.imgur.com/ScvjNmT.jpg

Parameter Sweeps

To use this, write your model generation script as a Haskell file, and then (for example)

caffe train --model <(runhaskell Model.hs) --solver=solver.prototxt

To perform a parameter sweep, use the parameterizing

for model in $(runhaskell Model.hs); do
    caffe train --model=$model --solver=solver.prototxt
done

dnngraph's People

Contributors

ajtulloch avatar timjb avatar tkelman 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  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  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

dnngraph's Issues

GoogLeNet.hs: *torch* doesn't work

I'm getting the error:

$ runhaskell NN/Examples/GoogLeNet.hs torch --output /tmp/x.prototxt
GoogLeNet.hs: NN/CLI.hs:32:7-43: Irrefutable pattern failed for pattern Just code

Have no idea. It seems to do something with the tilde which is used in the GoogLeNet.hs, but I don't have enough experience to get anywhere further…

support tensorflow

do you think it would be a good idea to try and make this library output tensorflow code? (or best left to an entirely new library wrapping up the c++...?)

if so, i'm happy to have a go at it.

List packages from which «dnngraph» consists in README

I tried to use cabal install dnngraph, and it didn't work, because there's no such a package. But from the fact that for building the examples directory, if there was a fail, it says caffegraph-0.1.0.2 failed during the building phase. — which is in hackage — I guess whole dnngraph actually consists of a list of packages. It would be great if they were somehow listed, so that it would be possible, e.g., to install the latest stable dnngraph from Stack.

«cabal install» fails

The build fails with

[75 of 79] Compiling NN.CLI           ( NN/CLI.hs, dist/dist-sandbox-f1ec6f88/build/NN/CLI.o )                              

NN/CLI.hs:38:1:                                                                                                             
    Ambiguous occurrence ‘makeLenses’                                                                                       
    It could refer to either ‘Control.Lens.makeLenses’,                                                                     
                             imported from ‘Control.Lens’ at NN/CLI.hs:5:1-53                                               
                             (and originally defined in ‘Control.Lens.TH’)                                                  
                          or ‘P.makeLenses’,                                                                                
                             imported from ‘Text.ProtocolBuffers’ at NN/CLI.hs:18:1-43                                      
                             (and originally defined in ‘Text.ProtocolBuffers.Reflections’)                                 
Failed to install caffegraph-0.1.0.2                                                                                        
cabal: Error: some packages failed to install:                                                                              
caffegraph-0.1.0.2 failed during the building phase. The exception was:
ExitFailure 1

I tried to use stack too for some packages, so I actually have that CLI.hs built already in my .stack-work directory. So I tried to trick it with

cp .stack-work/dist/x86_64-linux/Cabal-1.22.4.0/build/NN/CLI.* dist/dist-sandbox-f1ec6f88/build/NN/

But it didn't work, it still trying to compile the file, like it didn't see it is already built ☹

Hackage?

Is this intended to be installed via hackage? I do see that there is a similar "caffegraph" package there.

resnet example? pre-trained example?

I'd like to see a resnet example, as an notebook, if possible.

A notebook that re-uses pre-trained weights would be very useful - a way to actually get results without having to re-train.

many build errors maybe resulting from different hprotoc version?

when i build, with stack, i get

04:21 PM noon ∈ dnngraph@master>stack build
caffegraph-0.1.0.2: build
Preprocessing library caffegraph-0.1.0.2...
[65 of 79] Compiling NN.DSL           ( NN/DSL.hs, .stack-work/dist/x86_64-linux/Cabal-1.22.4.0/build/NN/DSL.o )

/home/noon/dev/dnngraph/NN/DSL.hs:74:13:
    Couldn't match type ‘Maybe Utf8’ with ‘s -> Identity t’
    Expected type: ASetter s t a68 (Maybe Utf8)
      Actual type: LayerParameter -> Maybe Utf8
    Relevant bindings include
      ty :: LayerTy -> s -> t (bound at NN/DSL.hs:74:1)
    In the first argument of ‘(?~)’, namely ‘LP.type'’
    In the expression: LP.type' ?~ s (asCaffe type'')

/home/noon/dev/dnngraph/NN/DSL.hs:77:23:
    Found hole ‘_type'’ with type: LayerParameter -> Maybe Utf8
    Relevant bindings include
      l :: LayerParameter (bound at NN/DSL.hs:77:9)
      layerTy :: LayerParameter -> LayerTy (bound at NN/DSL.hs:77:1)
    In the expression: LP._type'
    In the first argument of ‘fromJust’, namely ‘(LP._type' l)’
    In the first argument of ‘(&)’, namely ‘fromJust (LP._type' l)’

/home/noon/dev/dnngraph/NN/DSL.hs:79:18:
    Couldn't match type ‘Seq NetStateRule’ with ‘s -> Identity t’
    Expected type: ASetter s t (Seq a49) (Seq a49)
      Actual type: LayerParameter -> Seq NetStateRule
    Relevant bindings include
      phase' :: b -> s -> t (bound at NN/DSL.hs:79:1)
    In the first argument of ‘(<>~)’, namely ‘include’
    In the expression: include <>~ singleton (def & phase ?~ phase'')

/home/noon/dev/dnngraph/NN/DSL.hs:79:50:
    Couldn't match type ‘Maybe Phase’ with ‘a50 -> Identity a49’
    Expected type: ASetter a50 a49 a51 (Maybe b)
      Actual type: NetStateRule -> Maybe Phase
    In the first argument of ‘(?~)’, namely ‘phase’
    In the second argument of ‘(&)’, namely ‘phase ?~ phase''’

/home/noon/dev/dnngraph/NN/DSL.hs:81:12:
    Couldn't match type ‘Seq ParamSpec’ with ‘s -> Identity t’
    Expected type: ASetter s t a48 (Seq a)
      Actual type: LayerParameter -> Seq ParamSpec
    Relevant bindings include
      param' :: [a] -> s -> t (bound at NN/DSL.hs:81:1)
    In the first argument of ‘(.~)’, namely ‘param’
    In the expression: param .~ fromList v

/home/noon/dev/dnngraph/NN/DSL.hs:85:25:
    Couldn't match type ‘Maybe DataParameter’ with ‘s -> Identity t’
    Expected type: p23 (Maybe a53) (f23 (Maybe b23)) -> s -> Identity t
      Actual type: LayerParameter -> Maybe DataParameter
    Relevant bindings include
      source' :: String -> s -> t (bound at NN/DSL.hs:85:1)
    In the first argument of ‘setF’, namely ‘data_param’
    In the expression: setF data_param source (s source'')

/home/noon/dev/dnngraph/NN/DSL.hs:85:36:
    Couldn't match type ‘Maybe’ with ‘p23 a53’
    Expected type: (a52 -> Identity (Maybe Utf8)) -> p23 a53 (f23 b23)
      Actual type: DataParameter -> Maybe Utf8
    In the second argument of ‘setF’, namely ‘source’
    In the expression: setF data_param source (s source'')

/home/noon/dev/dnngraph/NN/DSL.hs:86:18:
    Couldn't match type ‘Maybe TransformationParameter’
                   with ‘s -> Identity t’
    Expected type: p0 (Maybe a3) (f0 (Maybe b0)) -> s -> Identity t
      Actual type: LayerParameter -> Maybe TransformationParameter
    Relevant bindings include
      cropSize' :: a -> s -> t (bound at NN/DSL.hs:86:1)
    In the first argument of ‘setF’, namely ‘transform_param’
    In the expression: setF transform_param TP.crop_size

/home/noon/dev/dnngraph/NN/DSL.hs:86:34:
    Couldn't match type ‘Maybe’ with ‘p0 a3’
    Expected type: (a2 -> Identity (Maybe a)) -> p0 a3 (f0 b0)
      Actual type: TransformationParameter -> Maybe Word32
    In the second argument of ‘setF’, namely ‘TP.crop_size’
    In the expression: setF transform_param TP.crop_size

/home/noon/dev/dnngraph/NN/DSL.hs:87:29:
    Couldn't match type ‘Maybe TransformationParameter’
                   with ‘s -> Identity t’
    Expected type: p24 (Maybe a55) (f24 (Maybe b24)) -> s -> Identity t
      Actual type: LayerParameter -> Maybe TransformationParameter
    Relevant bindings include
      meanFile' :: String -> s -> t (bound at NN/DSL.hs:87:1)
    In the first argument of ‘setF’, namely ‘transform_param’
    In the expression: setF transform_param TP.mean_file (s meanFile'')

/home/noon/dev/dnngraph/NN/DSL.hs:87:45:
    Couldn't match type ‘Maybe’ with ‘p24 a55’
    Expected type: (a54 -> Identity (Maybe Utf8)) -> p24 a55 (f24 b24)
      Actual type: TransformationParameter -> Maybe Utf8
    In the second argument of ‘setF’, namely ‘TP.mean_file’
    In the expression: setF transform_param TP.mean_file (s meanFile'')

/home/noon/dev/dnngraph/NN/DSL.hs:88:16:
    Couldn't match type ‘Maybe TransformationParameter’
                   with ‘s -> Identity t’
    Expected type: p1 (Maybe a5) (f1 (Maybe b1)) -> s -> Identity t
      Actual type: LayerParameter -> Maybe TransformationParameter
    Relevant bindings include
      mirror' :: a -> s -> t (bound at NN/DSL.hs:88:1)
    In the first argument of ‘setF’, namely ‘transform_param’
    In the expression: setF transform_param TP.mirror

/home/noon/dev/dnngraph/NN/DSL.hs:88:32:
    Couldn't match type ‘Maybe’ with ‘p1 a5’
    Expected type: (a4 -> Identity (Maybe a)) -> p1 a5 (f1 b1)
      Actual type: TransformationParameter -> Maybe Bool
    In the second argument of ‘setF’, namely ‘TP.mirror’
    In the expression: setF transform_param TP.mirror

/home/noon/dev/dnngraph/NN/DSL.hs:89:19:
    Couldn't match type ‘Maybe DataParameter’ with ‘s -> Identity t’
    Expected type: p2 (Maybe a7) (f2 (Maybe b2)) -> s -> Identity t
      Actual type: LayerParameter -> Maybe DataParameter
    Relevant bindings include
      batchSize' :: a -> s -> t (bound at NN/DSL.hs:89:1)
    In the first argument of ‘setF’, namely ‘data_param’
    In the expression: setF data_param batch_size

/home/noon/dev/dnngraph/NN/DSL.hs:89:30:
    Couldn't match type ‘Maybe’ with ‘p2 a7’
    Expected type: (a6 -> Identity (Maybe a)) -> p2 a7 (f2 b2)
      Actual type: DataParameter -> Maybe Word32
    In the second argument of ‘setF’, namely ‘batch_size’
    In the expression: setF data_param batch_size

/home/noon/dev/dnngraph/NN/DSL.hs:90:18:
    Couldn't match type ‘Maybe DataParameter’ with ‘s -> Identity t’
    Expected type: p3 (Maybe a9) (f3 (Maybe b3)) -> s -> Identity t
      Actual type: LayerParameter -> Maybe DataParameter
    Relevant bindings include
      backend' :: a -> s -> t (bound at NN/DSL.hs:90:1)
    In the first argument of ‘setF’, namely ‘data_param’
    In the expression: setF data_param backend

/home/noon/dev/dnngraph/NN/DSL.hs:90:29:
    Couldn't match type ‘Maybe’ with ‘p3 a9’
    Expected type: (a8 -> Identity (Maybe a)) -> p3 a9 (f3 b3)
      Actual type: DataParameter -> Maybe Gen.Caffe.DataParameter.DB.DB
    In the second argument of ‘setF’, namely ‘backend’
    In the expression: setF data_param backend

/home/noon/dev/dnngraph/NN/DSL.hs:93:16:
    Couldn't match type ‘Maybe ConvolutionParameter’
                   with ‘s -> Identity t’
    Expected type: p (Maybe a91) (f (Maybe b)) -> s -> Identity t
      Actual type: LayerParameter -> Maybe ConvolutionParameter
    Relevant bindings include
      setConv :: ((a -> Identity (Maybe a92)) -> p a91 (f b))
                 -> a92 -> s -> t
        (bound at NN/DSL.hs:93:1)
    In the first argument of ‘setF’, namely ‘convolution_param’
    In the expression: setF convolution_param

/home/noon/dev/dnngraph/NN/DSL.hs:94:23:
    Couldn't match type ‘Maybe’ with ‘p4 a11’
    Expected type: (a10 -> Identity (Maybe a)) -> p4 a11 (f4 b4)
      Actual type: ConvolutionParameter -> Maybe Word32
    In the first argument of ‘setConv’, namely ‘CP.num_output’
    In the expression: setConv CP.num_output

/home/noon/dev/dnngraph/NN/DSL.hs:95:22:
    Couldn't match type ‘Maybe’ with ‘p5 a13’
    Expected type: (a12 -> Identity (Maybe a)) -> p5 a13 (f5 b5)
      Actual type: ConvolutionParameter -> Maybe Word32
    In the first argument of ‘setConv’, namely ‘CP.num_input’
    In the expression: setConv CP.num_input

/home/noon/dev/dnngraph/NN/DSL.hs:96:24:
    Couldn't match type ‘Maybe’ with ‘p6 a15’
    Expected type: (a14 -> Identity (Maybe a)) -> p6 a15 (f6 b6)
      Actual type: ConvolutionParameter -> Maybe Word32
    In the first argument of ‘setConv’, namely ‘CP.kernel_size’
    In the expression: setConv CP.kernel_size

/home/noon/dev/dnngraph/NN/DSL.hs:97:17:
    Couldn't match type ‘Maybe’ with ‘p7 a17’
    Expected type: (a16 -> Identity (Maybe a)) -> p7 a17 (f7 b7)
      Actual type: ConvolutionParameter -> Maybe Word32
    In the first argument of ‘setConv’, namely ‘CP.pad’
    In the expression: setConv CP.pad

/home/noon/dev/dnngraph/NN/DSL.hs:98:19:
    Couldn't match type ‘Maybe’ with ‘p8 a19’
    Expected type: (a18 -> Identity (Maybe a)) -> p8 a19 (f8 b8)
      Actual type: ConvolutionParameter -> Maybe Word32
    In the first argument of ‘setConv’, namely ‘group’
    In the expression: setConv group

/home/noon/dev/dnngraph/NN/DSL.hs:99:20:
    Couldn't match type ‘Maybe’ with ‘p9 a21’
    Expected type: (a20 -> Identity (Maybe a)) -> p9 a21 (f9 b9)
      Actual type: ConvolutionParameter -> Maybe Word32
    In the first argument of ‘setConv’, namely ‘CP.stride’
    In the expression: setConv CP.stride

/home/noon/dev/dnngraph/NN/DSL.hs:100:24:
    Couldn't match type ‘Maybe’ with ‘p10 a23’
    Expected type: (a22 -> Identity (Maybe a)) -> p10 a23 (f10 b10)
      Actual type: ConvolutionParameter -> Maybe FillerParameter
    In the first argument of ‘setConv’, namely ‘CP.bias_filler’
    In the expression: setConv CP.bias_filler

/home/noon/dev/dnngraph/NN/DSL.hs:101:26:
    Couldn't match type ‘Maybe’ with ‘p11 a25’
    Expected type: (a24 -> Identity (Maybe a)) -> p11 a25 (f11 b11)
      Actual type: ConvolutionParameter -> Maybe FillerParameter
    In the first argument of ‘setConv’, namely ‘CP.weight_filler’
    In the expression: setConv CP.weight_filler

/home/noon/dev/dnngraph/NN/DSL.hs:104:16:
    Couldn't match type ‘Maybe PoolingParameter’ with ‘s -> Identity t’
    Expected type: p (Maybe a91) (f (Maybe b)) -> s -> Identity t
      Actual type: LayerParameter -> Maybe PoolingParameter
    Relevant bindings include
      setPool :: ((a -> Identity (Maybe a92)) -> p a91 (f b))
                 -> a92 -> s -> t
        (bound at NN/DSL.hs:104:1)
    In the first argument of ‘setF’, namely ‘pooling_param’
    In the expression: setF pooling_param

/home/noon/dev/dnngraph/NN/DSL.hs:105:17:
    Couldn't match type ‘Maybe’ with ‘p12 a27’
    Expected type: (a26 -> Identity (Maybe a)) -> p12 a27 (f12 b12)
      Actual type: PoolingParameter -> Maybe PoolMethod
    In the first argument of ‘setPool’, namely ‘pool’
    In the expression: setPool pool

/home/noon/dev/dnngraph/NN/DSL.hs:106:18:
    Couldn't match type ‘Maybe’ with ‘p13 a29’
    Expected type: (a28 -> Identity (Maybe a)) -> p13 a29 (f13 b13)
      Actual type: PoolingParameter -> Maybe Word32
    In the first argument of ‘setPool’, namely ‘PP.kernel_size’
    In the expression: setPool PP.kernel_size

/home/noon/dev/dnngraph/NN/DSL.hs:107:20:
    Couldn't match type ‘Maybe’ with ‘p14 a31’
    Expected type: (a30 -> Identity (Maybe a)) -> p14 a31 (f14 b14)
      Actual type: PoolingParameter -> Maybe Word32
    In the first argument of ‘setPool’, namely ‘PP.stride’
    In the expression: setPool PP.stride

/home/noon/dev/dnngraph/NN/DSL.hs:108:17:
    Couldn't match type ‘Maybe’ with ‘p15 a33’
    Expected type: (a32 -> Identity (Maybe a)) -> p15 a33 (f15 b15)
      Actual type: PoolingParameter -> Maybe Word32
    In the first argument of ‘setPool’, namely ‘PP.pad’
    In the expression: setPool PP.pad

/home/noon/dev/dnngraph/NN/DSL.hs:111:14:
    Couldn't match type ‘Maybe InnerProductParameter’
                   with ‘s -> Identity t’
    Expected type: p (Maybe a91) (f (Maybe b)) -> s -> Identity t
      Actual type: LayerParameter -> Maybe InnerProductParameter
    Relevant bindings include
      setIP :: ((a -> Identity (Maybe a92)) -> p a91 (f b))
               -> a92 -> s -> t
        (bound at NN/DSL.hs:111:1)
    In the first argument of ‘setF’, namely ‘inner_product_param’
    In the expression: setF inner_product_param

/home/noon/dev/dnngraph/NN/DSL.hs:112:25:
    Couldn't match type ‘Maybe’ with ‘p16 a35’
    Expected type: (a34 -> Identity (Maybe a)) -> p16 a35 (f16 b16)
      Actual type: InnerProductParameter -> Maybe FillerParameter
    In the first argument of ‘setIP’, namely ‘IP.weight_filler’
    In the expression: setIP IP.weight_filler

/home/noon/dev/dnngraph/NN/DSL.hs:113:21:
    Couldn't match type ‘Maybe’ with ‘p17 a37’
    Expected type: (a36 -> Identity (Maybe a)) -> p17 a37 (f17 b17)
      Actual type: InnerProductParameter -> Maybe Word32
    In the first argument of ‘setIP’, namely ‘IP.num_input’
    In the expression: setIP IP.num_input

/home/noon/dev/dnngraph/NN/DSL.hs:114:22:
    Couldn't match type ‘Maybe’ with ‘p18 a39’
    Expected type: (a38 -> Identity (Maybe a)) -> p18 a39 (f18 b18)
      Actual type: InnerProductParameter -> Maybe Word32
    In the first argument of ‘setIP’, namely ‘IP.num_output’
    In the expression: setIP IP.num_output

/home/noon/dev/dnngraph/NN/DSL.hs:115:23:
    Couldn't match type ‘Maybe’ with ‘p19 a41’
    Expected type: (a40 -> Identity (Maybe a)) -> p19 a41 (f19 b19)
      Actual type: InnerProductParameter -> Maybe FillerParameter
    In the first argument of ‘setIP’, namely ‘IP.bias_filler’
    In the expression: setIP IP.bias_filler

/home/noon/dev/dnngraph/NN/DSL.hs:118:15:
    Couldn't match type ‘Maybe LRNParameter’ with ‘s -> Identity t’
    Expected type: p (Maybe a91) (f (Maybe b)) -> s -> Identity t
      Actual type: LayerParameter -> Maybe LRNParameter
    Relevant bindings include
      setLRN :: ((a -> Identity (Maybe a92)) -> p a91 (f b))
                -> a92 -> s -> t
        (bound at NN/DSL.hs:118:1)
    In the first argument of ‘setF’, namely ‘lrn_param’
    In the expression: setF lrn_param

/home/noon/dev/dnngraph/NN/DSL.hs:119:21:
    Couldn't match type ‘Maybe’ with ‘p20 a43’
    Expected type: (a42 -> Identity (Maybe a)) -> p20 a43 (f20 b20)
      Actual type: LRNParameter -> Maybe Word32
    In the first argument of ‘setLRN’, namely ‘local_size’
    In the expression: setLRN local_size

/home/noon/dev/dnngraph/NN/DSL.hs:120:20:
    Couldn't match type ‘Maybe’ with ‘p21 a45’
    Expected type: (a44 -> Identity (Maybe a)) -> p21 a45 (f21 b21)
      Actual type: LRNParameter -> Maybe Float
    In the first argument of ‘setLRN’, namely ‘alpha’
    In the expression: setLRN alpha

/home/noon/dev/dnngraph/NN/DSL.hs:121:19:
    Couldn't match type ‘Maybe’ with ‘p22 a47’
    Expected type: (a46 -> Identity (Maybe a)) -> p22 a47 (f22 b22)
      Actual type: LRNParameter -> Maybe Float
    In the first argument of ‘setLRN’, namely ‘beta’
    In the expression: setLRN beta

/home/noon/dev/dnngraph/NN/DSL.hs:124:25:
    Couldn't match type ‘Maybe Utf8’ with ‘a57 -> Identity a56’
    Expected type: ASetter a57 a56 a58 (Maybe Utf8)
      Actual type: FillerParameter -> Maybe Utf8
    In the first argument of ‘(?~)’, namely ‘FP.type'’
    In the second argument of ‘(&)’, namely ‘FP.type' ?~ s "constant"’

/home/noon/dev/dnngraph/NN/DSL.hs:124:52:
    Couldn't match type ‘Maybe Float’ with ‘a56 -> Identity b’
    Expected type: ASetter a56 b a59 (Maybe b34)
      Actual type: FillerParameter -> Maybe Float
    Relevant bindings include
      constant :: b34 -> b (bound at NN/DSL.hs:124:1)
    In the first argument of ‘(?~)’, namely ‘value’
    In the second argument of ‘(&)’, namely ‘value ?~ value'’

/home/noon/dev/dnngraph/NN/DSL.hs:125:23:
    Couldn't match type ‘Maybe Utf8’ with ‘a61 -> Identity a60’
    Expected type: ASetter a61 a60 a62 (Maybe Utf8)
      Actual type: FillerParameter -> Maybe Utf8
    In the first argument of ‘(?~)’, namely ‘FP.type'’
    In the second argument of ‘(&)’, namely ‘FP.type' ?~ s "gaussian"’

/home/noon/dev/dnngraph/NN/DSL.hs:125:50:
    Couldn't match type ‘Maybe Float’ with ‘a60 -> Identity b’
    Expected type: ASetter a60 b a63 (Maybe b34)
      Actual type: FillerParameter -> Maybe Float
    Relevant bindings include
      gaussian :: b34 -> b (bound at NN/DSL.hs:125:1)
    In the first argument of ‘(?~)’, namely ‘std’
    In the second argument of ‘(&)’, namely ‘std ?~ std'’

/home/noon/dev/dnngraph/NN/DSL.hs:126:21:
    Couldn't match type ‘Maybe Utf8’ with ‘a65 -> Identity a64’
    Expected type: ASetter a65 a64 a66 (Maybe Utf8)
      Actual type: FillerParameter -> Maybe Utf8
    In the first argument of ‘(?~)’, namely ‘FP.type'’
    In the second argument of ‘(&)’, namely ‘FP.type' ?~ s "xavier"’

/home/noon/dev/dnngraph/NN/DSL.hs:126:46:
    Couldn't match type ‘Maybe Float’ with ‘a64 -> Identity b’
    Expected type: ASetter a64 b a67 (Maybe b34)
      Actual type: FillerParameter -> Maybe Float
    Relevant bindings include
      xavier :: b34 -> b (bound at NN/DSL.hs:126:1)
    In the first argument of ‘(?~)’, namely ‘std’
    In the second argument of ‘(&)’, namely ‘std ?~ std'’

/home/noon/dev/dnngraph/NN/DSL.hs:130:18:
    Couldn't match type ‘Maybe Float’ with ‘s -> Identity t’
    Expected type: ASetter s t a1 (Maybe b)
      Actual type: ParamSpec -> Maybe Float
    Relevant bindings include
      lrMult' :: b -> s -> t (bound at NN/DSL.hs:130:1)
    In the first argument of ‘(?~)’, namely ‘lr_mult’
    In the expression: lr_mult ?~ value'

/home/noon/dev/dnngraph/NN/DSL.hs:131:21:
    Couldn't match type ‘Maybe Float’ with ‘s -> Identity t’
    Expected type: ASetter s t a0 (Maybe b)
      Actual type: ParamSpec -> Maybe Float
    Relevant bindings include
      decayMult' :: b -> s -> t (bound at NN/DSL.hs:131:1)
    In the first argument of ‘(?~)’, namely ‘decay_mult’
    In the expression: decay_mult ?~ value'

/home/noon/dev/dnngraph/NN/DSL.hs:134:49:
    Couldn't match type ‘Maybe AccuracyParameter’
                   with ‘a69 -> Identity b’
    Expected type: ASetter a69 b a70 (Maybe b25)
      Actual type: LayerParameter -> Maybe AccuracyParameter
    Relevant bindings include
      accuracy :: b34 -> b (bound at NN/DSL.hs:134:1)
    In the first argument of ‘(?~)’, namely ‘accuracy_param’
    In the second argument of ‘(&)’, namely
      ‘accuracy_param ?~ (def & top_k ?~ k')’

/home/noon/dev/dnngraph/NN/DSL.hs:134:74:
    Couldn't match type ‘Maybe Word32’ with ‘a71 -> Identity b25’
    Expected type: ASetter a71 b25 a72 (Maybe b34)
      Actual type: AccuracyParameter -> Maybe Word32
    In the first argument of ‘(?~)’, namely ‘top_k’
    In the second argument of ‘(&)’, namely ‘top_k ?~ k'’

/home/noon/dev/dnngraph/NN/DSL.hs:135:11:
    No instance for (Default s1) arising from a use of ‘def’
    The type variable ‘s1’ is ambiguous
    Note: there are several potential instances:
      instance Default (Maybe a)
        -- Defined in ‘Text.ProtocolBuffers.Basic’
      instance Default Int32 -- Defined in ‘Text.ProtocolBuffers.Basic’
      instance Default Int64 -- Defined in ‘Text.ProtocolBuffers.Basic’
      ...plus 58 others
    In the first argument of ‘(&)’, namely ‘def’
    In the expression: def & ty SoftmaxWithLoss
    In an equation for ‘softmax’: softmax = def & ty SoftmaxWithLoss

/home/noon/dev/dnngraph/NN/DSL.hs:136:36:
    Couldn't match type ‘Maybe DropoutParameter’
                   with ‘a73 -> Identity b’
    Expected type: ASetter a73 b a74 (Maybe b26)
      Actual type: LayerParameter -> Maybe DropoutParameter
    Relevant bindings include
      dropout :: b34 -> b (bound at NN/DSL.hs:136:1)
    In the first argument of ‘(?~)’, namely ‘dropout_param’
    In the second argument of ‘(&)’, namely
      ‘dropout_param ?~ (def & dropout_ratio ?~ ratio)’

/home/noon/dev/dnngraph/NN/DSL.hs:136:60:
    Couldn't match type ‘Maybe Float’ with ‘a75 -> Identity b26’
    Expected type: ASetter a75 b26 a76 (Maybe b34)
      Actual type: DropoutParameter -> Maybe Float
    In the first argument of ‘(?~)’, namely ‘dropout_ratio’
    In the second argument of ‘(&)’, namely ‘dropout_ratio ?~ ratio’

/home/noon/dev/dnngraph/NN/DSL.hs:137:8:
    No instance for (Default s3) arising from a use of ‘def’
    The type variable ‘s3’ is ambiguous
    Note: there are several potential instances:
      instance Default (Maybe a)
        -- Defined in ‘Text.ProtocolBuffers.Basic’
      instance Default Int32 -- Defined in ‘Text.ProtocolBuffers.Basic’
      instance Default Int64 -- Defined in ‘Text.ProtocolBuffers.Basic’
      ...plus 58 others
    In the first argument of ‘(&)’, namely ‘def’
    In the expression: def & ty ReLU
    In an equation for ‘relu’: relu = def & ty ReLU

/home/noon/dev/dnngraph/NN/DSL.hs:138:24:
    Couldn't match type ‘Maybe ConvolutionParameter’
                   with ‘a77 -> Identity b’
    Expected type: ASetter a77 b a78 (Maybe b27)
      Actual type: LayerParameter -> Maybe ConvolutionParameter
    Relevant bindings include conv :: b (bound at NN/DSL.hs:138:1)
    In the first argument of ‘(?~)’, namely ‘convolution_param’
    In the second argument of ‘(&)’, namely ‘convolution_param ?~ def’

/home/noon/dev/dnngraph/NN/DSL.hs:139:22:
    Couldn't match type ‘Maybe InnerProductParameter’
                   with ‘a79 -> Identity s6’
    Expected type: ASetter a79 s6 a80 (Maybe b28)
      Actual type: LayerParameter -> Maybe InnerProductParameter
    In the first argument of ‘(?~)’, namely ‘inner_product_param’
    In the second argument of ‘(&)’, namely
      ‘inner_product_param ?~ def’

/home/noon/dev/dnngraph/NN/DSL.hs:140:25:
    Couldn't match type ‘Maybe TransformationParameter’
                   with ‘a82 -> Identity a81’
    Expected type: ASetter a82 a81 a83 (Maybe b29)
      Actual type: LayerParameter -> Maybe TransformationParameter
    In the first argument of ‘(?~)’, namely ‘transform_param’
    In the second argument of ‘(&)’, namely ‘transform_param ?~ def’

/home/noon/dev/dnngraph/NN/DSL.hs:140:50:
    Couldn't match type ‘Maybe DataParameter’ with ‘a81 -> Identity b’
    Expected type: ASetter a81 b a84 (Maybe b30)
      Actual type: LayerParameter -> Maybe DataParameter
    Relevant bindings include data' :: b (bound at NN/DSL.hs:140:1)
    In the first argument of ‘(?~)’, namely ‘data_param’
    In the second argument of ‘(&)’, namely ‘data_param ?~ def’

/home/noon/dev/dnngraph/NN/DSL.hs:141:27:
    Couldn't match type ‘Maybe PoolingParameter’
                   with ‘a85 -> Identity s9’
    Expected type: ASetter a85 s9 a86 (Maybe b31)
      Actual type: LayerParameter -> Maybe PoolingParameter
    In the first argument of ‘(?~)’, namely ‘pooling_param’
    In the second argument of ‘(&)’, namely ‘pooling_param ?~ def’

/home/noon/dev/dnngraph/NN/DSL.hs:142:27:
    Couldn't match type ‘Maybe PoolingParameter’
                   with ‘a87 -> Identity s11’
    Expected type: ASetter a87 s11 a88 (Maybe b32)
      Actual type: LayerParameter -> Maybe PoolingParameter
    In the first argument of ‘(?~)’, namely ‘pooling_param’
    In the second argument of ‘(&)’, namely ‘pooling_param ?~ def’

/home/noon/dev/dnngraph/NN/DSL.hs:143:22:
    Couldn't match type ‘Maybe LRNParameter’ with ‘a89 -> Identity b’
    Expected type: ASetter a89 b a90 (Maybe b33)
      Actual type: LayerParameter -> Maybe LRNParameter
    Relevant bindings include lrn :: b (bound at NN/DSL.hs:143:1)
    In the first argument of ‘(?~)’, namely ‘lrn_param’
    In the second argument of ‘(&)’, namely ‘lrn_param ?~ def’

/home/noon/dev/dnngraph/NN/DSL.hs:144:11:
    No instance for (Default s13) arising from a use of ‘def’
    The type variable ‘s13’ is ambiguous
    Note: there are several potential instances:
      instance Default (Maybe a)
        -- Defined in ‘Text.ProtocolBuffers.Basic’
      instance Default Int32 -- Defined in ‘Text.ProtocolBuffers.Basic’
      instance Default Int64 -- Defined in ‘Text.ProtocolBuffers.Basic’
      ...plus 58 others
    In the first argument of ‘(&)’, namely ‘def’
    In the expression: def & ty Concat
    In an equation for ‘concat'’: concat' = def & ty Concat

--  While building package caffegraph-0.1.0.2 using:
      /home/noon/.stack/setup-exe-cache/setup-Simple-Cabal-1.22.4.0-x86_64-linux-ghc-7.10.2 --builddir=.stack-work/dist/x86_64-linux/Cabal-1.22.4.0/ build lib:caffegraph --ghc-options " -ddump-hi -ddump-to-file"
    Process exited with code: ExitFailure 1

these seem like something is fundamentally a bit wrong.

i'm not sure if this is because the build environment isn't properly specified; or because the project is in need of some refactoring?

GoogLeNet.hs: pdf output doesn't work

It's saying:

$ runhaskell NN/Examples/GoogLeNet.hs visualize --format pdf --output /tmp/x.pdf
GoogLeNet.hs: dot: runInteractiveProcess: runInteractiveProcess: exec: does not exist (No such file or directory)

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.