Home

Awesome

The tensorflow-ocaml project provides some OCaml bindings for TensorFlow.

Experimental ocaml bindings for PyTorch can be found in the ocaml-torch repo.

Installation

Use opam to install the tensorflow-ocaml package. Starting from version 0.0.11 this will automatically install the TensorFlow library.

opam install tensorflow

Build a simple example or run utop

To build your first TensorFlow program, create a new directory and cd into it. Then create a forty_two.ml file with the following content:

open Tensorflow

let () =
  let forty_two = Ops.(f 40. + f 2.) in
  let v = Session.run (Session.Output.scalar_float forty_two) in
  Printf.printf "%f\n%!" v

Then create a dune file with the following content:

(executables
  (names forty_two)
  (libraries tensorflow))

Run dune build forty_two.exe to compile the program and _build/default/forty_two.exe to run it!

You can also use Tensorflow via utop.

utop

Optional step for GPU support

The TensorFlow library installed via opam does not support GPU acceleration. In order to use your GPU you will have to install TensorFlow 1.14, either by building it from source or by using prebuilt binaries. Then the library should be installed system-wide or you could set the LIBTENSORFLOW environment variable.

    export LIBTENSORFLOW={path_to_folder_with_libtensorflow.so}

Possible ways to get the TensorFlow library:

Examples

Tensorflow-ocaml includes two different APIs to write graphs.

Using the Graph API

The graph API is very close to the original TensorFlow API.

Using the FNN API

The FNN API is a layer based API to easily build neural-networks. A linear classifier could be defined and trained in a couple lines:

  let input, input_id = Fnn.input ~shape:(D1 image_dim) in
  let model =
    Fnn.dense label_count input
    |> Fnn.softmax
    |> Fnn.Model.create Float
  in
  Fnn.Model.fit model
    ~loss:(Fnn.Loss.cross_entropy `mean)
    ~optimizer:(Fnn.Optimizer.gradient_descent ~learning_rate:8.)
    ~epochs
    ~input_id
    ~xs:train_images
    ~ys:train_labels;

A complete VGG-19 model can be defined as follows:

let vgg19 () =
  let block iter ~block_idx ~out_channels x =
    List.init iter ~f:Fn.id
    |> List.fold ~init:x ~f:(fun acc idx ->
      Fnn.conv2d () acc
        ~name:(sprintf "conv%d_%d" block_idx (idx+1))
        ~w_init:(`normal 0.1) ~filter:(3, 3) ~strides:(1, 1) ~padding:`same ~out_channels
      |> Fnn.relu)
    |> Fnn.max_pool ~filter:(2, 2) ~strides:(2, 2) ~padding:`same
  in
  let input, input_id = Fnn.input ~shape:(D3 (img_size, img_size, 3)) in
  let model =
    Fnn.reshape input ~shape:(D3 (img_size, img_size, 3))
    |> block 2 ~block_idx:1 ~out_channels:64
    |> block 2 ~block_idx:2 ~out_channels:128
    |> block 4 ~block_idx:3 ~out_channels:256
    |> block 4 ~block_idx:4 ~out_channels:512
    |> block 4 ~block_idx:5 ~out_channels:512
    |> Fnn.flatten
    |> Fnn.dense ~name:"fc6" ~w_init:(`normal 0.1) 4096
    |> Fnn.relu
    |> Fnn.dense ~name:"fc7" ~w_init:(`normal 0.1) 4096
    |> Fnn.relu
    |> Fnn.dense ~name:"fc8" ~w_init:(`normal 0.1) 1000
    |> Fnn.softmax
    |> Fnn.Model.create Float
  in
  input_id, model

This model is used in the following example to classify an input image. In order to use it you will have to download the pre-trained weights.

There are also some MNIST based examples.

Other Examples

The examples directory contains various models among which:

Dependencies