mirror of
https://github.com/tensorflow/haskell.git
synced 2024-11-23 03:19:44 +01:00
Add example to README + make haddock link more prominent (#60)
This commit is contained in:
parent
1ffc5c4383
commit
4fb68f3aa3
3 changed files with 122 additions and 1 deletions
64
README.md
64
README.md
|
@ -5,7 +5,69 @@ The tensorflow-haskell package provides Haskell bindings to
|
|||
|
||||
This is not an official Google product.
|
||||
|
||||
# Instructions
|
||||
# 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
|
||||
|
||||
## Build with Docker on Linux
|
||||
|
||||
|
|
|
@ -30,6 +30,18 @@ library
|
|||
, text
|
||||
default-language: Haskell2010
|
||||
|
||||
Test-Suite RegressionTest
|
||||
default-language: Haskell2010
|
||||
type: exitcode-stdio-1.0
|
||||
main-is: RegressionTest.hs
|
||||
hs-source-dirs: tests
|
||||
build-depends: base
|
||||
, HUnit
|
||||
, random
|
||||
, tensorflow
|
||||
, tensorflow-core-ops
|
||||
, tensorflow-ops
|
||||
|
||||
Test-Suite BuildTest
|
||||
default-language: Haskell2010
|
||||
type: exitcode-stdio-1.0
|
||||
|
|
47
tensorflow-ops/tests/RegressionTest.hs
Normal file
47
tensorflow-ops/tests/RegressionTest.hs
Normal file
|
@ -0,0 +1,47 @@
|
|||
-- | Simple linear regression example for the README.
|
||||
|
||||
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
|
Loading…
Reference in a new issue