2016-10-29 03:08:32 +02:00
|
|
|
[![Build Status](https://ci.tensorflow.org/buildStatus/icon?job=tensorflow-haskell-master)](https://ci.tensorflow.org/job/tensorflow-haskell-master)
|
|
|
|
|
2016-10-24 21:26:42 +02:00
|
|
|
The tensorflow-haskell package provides Haskell bindings to
|
|
|
|
[TensorFlow](https://www.tensorflow.org/).
|
|
|
|
|
|
|
|
This is not an official Google product.
|
|
|
|
|
2017-01-17 05:44:45 +01:00
|
|
|
# Documentation
|
|
|
|
|
|
|
|
https://tensorflow.github.io/haskell/haddock/
|
|
|
|
|
|
|
|
[TensorFlow.Core](https://tensorflow.github.io/haskell/haddock/tensorflow-0.1.0.0/TensorFlow-Core.html)
|
|
|
|
is a good place to start.
|
|
|
|
|
|
|
|
# Examples
|
|
|
|
|
|
|
|
Neural network model for the MNIST dataset: [code](tensorflow-mnist/app/Main.hs)
|
|
|
|
|
|
|
|
Toy example of a linear regression model
|
|
|
|
([full code](tensorflow-ops/tests/RegressionTest.hs)):
|
|
|
|
|
|
|
|
```haskell
|
|
|
|
import Control.Monad (replicateM, replicateM_, zipWithM)
|
|
|
|
import System.Random (randomIO)
|
|
|
|
import Test.HUnit (assertBool)
|
|
|
|
|
|
|
|
import qualified TensorFlow.Core as TF
|
|
|
|
import qualified TensorFlow.GenOps.Core as TF
|
|
|
|
import qualified TensorFlow.Gradient as TF
|
|
|
|
import qualified TensorFlow.Ops as TF
|
|
|
|
|
|
|
|
main :: IO ()
|
|
|
|
main = do
|
|
|
|
-- Generate data where `y = x*3 + 8`.
|
|
|
|
xData <- replicateM 100 randomIO
|
|
|
|
let yData = [x*3 + 8 | x <- xData]
|
|
|
|
-- Fit linear regression model.
|
|
|
|
(w, b) <- fit xData yData
|
|
|
|
assertBool "w == 3" (abs (3 - w) < 0.001)
|
|
|
|
assertBool "b == 8" (abs (8 - b) < 0.001)
|
|
|
|
|
|
|
|
fit :: [Float] -> [Float] -> IO (Float, Float)
|
|
|
|
fit xData yData = TF.runSession $ do
|
|
|
|
-- Create tensorflow constants for x and y.
|
|
|
|
let x = TF.vector xData
|
|
|
|
y = TF.vector yData
|
|
|
|
-- Create scalar variables for slope and intercept.
|
|
|
|
w <- TF.build (TF.initializedVariable 0)
|
|
|
|
b <- TF.build (TF.initializedVariable 0)
|
|
|
|
-- Define the loss function.
|
|
|
|
let yHat = (x `TF.mul` w) `TF.add` b
|
|
|
|
loss = TF.square (yHat `TF.sub` y)
|
|
|
|
-- Optimize with gradient descent.
|
|
|
|
trainStep <- TF.build (gradientDescent 0.001 loss [w, b])
|
|
|
|
replicateM_ 1000 (TF.run trainStep)
|
|
|
|
-- Return the learned parameters.
|
|
|
|
(TF.Scalar w', TF.Scalar b') <- TF.run (w, b)
|
|
|
|
return (w', b')
|
|
|
|
|
|
|
|
gradientDescent :: Float
|
|
|
|
-> TF.Tensor TF.Value Float
|
|
|
|
-> [TF.Tensor TF.Ref Float]
|
|
|
|
-> TF.Build TF.ControlNode
|
|
|
|
gradientDescent alpha loss params = do
|
|
|
|
let applyGrad param grad =
|
|
|
|
TF.assign param (param `TF.sub` (TF.scalar alpha `TF.mul` grad))
|
|
|
|
TF.group =<< zipWithM applyGrad params =<< TF.gradients loss params
|
|
|
|
```
|
|
|
|
|
|
|
|
# Installation Instructions
|
2016-10-24 21:26:42 +02:00
|
|
|
|
2016-10-26 20:13:42 +02:00
|
|
|
## Build with Docker on Linux
|
2016-10-24 21:26:42 +02:00
|
|
|
|
2016-10-25 18:53:35 +02:00
|
|
|
As an expedient we use [docker](https://www.docker.com/) for building. Once you have docker
|
2016-10-24 21:26:42 +02:00
|
|
|
working, the following commands will compile and run the tests.
|
|
|
|
|
|
|
|
git clone --recursive https://github.com/tensorflow/haskell.git tensorflow-haskell
|
|
|
|
cd tensorflow-haskell
|
|
|
|
IMAGE_NAME=tensorflow/haskell:v0
|
|
|
|
docker build -t $IMAGE_NAME docker
|
|
|
|
# TODO: move the setup step to the docker script.
|
|
|
|
stack --docker --docker-image=$IMAGE_NAME setup
|
|
|
|
stack --docker --docker-image=$IMAGE_NAME test
|
|
|
|
|
|
|
|
There is also a demo application:
|
|
|
|
|
|
|
|
cd tensorflow-mnist
|
|
|
|
stack --docker --docker-image=$IMAGE_NAME build --exec Main
|
2016-10-26 20:13:42 +02:00
|
|
|
|
|
|
|
## Build on Mac OS X
|
|
|
|
|
|
|
|
The following instructions were verified with Mac OS X El Capitan.
|
|
|
|
|
|
|
|
- Install dependencies via [Homebrew](http://brew.sh):
|
|
|
|
|
2017-02-13 07:17:38 +01:00
|
|
|
brew install protobuf
|
|
|
|
brew install snappy
|
2016-10-26 20:13:42 +02:00
|
|
|
|
2017-02-13 07:17:38 +01:00
|
|
|
- Install the TensorFlow library on your machine:
|
2016-10-26 20:13:42 +02:00
|
|
|
|
2017-02-23 00:24:45 +01:00
|
|
|
curl https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-cpu-darwin-x86_64-1.0.0.tar.gz > libtensorflow.tar.gz
|
2017-02-13 07:17:38 +01:00
|
|
|
tar zxf libtensorflow.tar.gz -C /usr/local
|
|
|
|
mv /usr/local/lib/libtensorflow.so /usr/local/lib/libtensorflow.dylib
|
2017-02-09 23:20:43 +01:00
|
|
|
install_name_tool -id libtensorflow.dylib /usr/local/lib/libtensorflow.dylib
|
2017-02-13 07:17:38 +01:00
|
|
|
rm libtensorflow.tar.gz
|
2016-10-26 20:13:42 +02:00
|
|
|
|
|
|
|
- Run stack:
|
|
|
|
|
|
|
|
stack test
|