Haskell Artificial Neural Networking library
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

21 lignes
15KB

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Network</title><link href="ocean.css" rel="stylesheet" type="text/css" title="Ocean" /><script src="haddock-util.js" type="text/javascript"></script><script type="text/javascript">//<![CDATA[
  2. window.onload = function () {pageLoad();setSynopsis("mini_Network.html");};
  3. //]]>
  4. </script></head><body><div id="package-header"><ul class="links" id="page-menu"><li><a href="index.html">Contents</a></li><li><a href="doc-index.html">Index</a></li></ul><p class="caption empty">&nbsp;</p></div><div id="content"><div id="module-header"><table class="info"><tr><th>Copyright</th><td>(c) 2017 Christian Merten</td></tr><tr><th>Maintainer</th><td>c.merten@gmx.net</td></tr><tr><th>Stability</th><td>experimental</td></tr><tr><th>Portability</th><td>GHC</td></tr><tr><th>Safe Haskell</th><td>None</td></tr></table><p class="caption">Network</p></div><div id="table-of-contents"><p class="caption">Contents</p><ul><li><a href="#g:1">Network</a></li><li><a href="#g:2">Learning functions</a></li><li><a href="#g:3">Activation functions</a></li><li><a href="#g:4">Network serialization</a></li></ul></div><div id="description"><p class="caption">Description</p><div class="doc"><p>An implementation of artifical feed-forward neural networks in pure Haskell.</p><p>An example is added in <em>XOR.hs</em></p></div></div><div id="synopsis"><p id="control.syn" class="caption expander" onclick="toggleSection('syn')">Synopsis</p><ul id="section.syn" class="hide" onclick="toggleSection('syn')"><li class="src short"><span class="keyword">data</span> <a href="#t:Network">Network</a> a = <a href="#v:Network">Network</a> {<ul class="subs"><li><a href="#v:layers">layers</a> :: [<a href="Network.html#t:Layer">Layer</a> a]</li></ul>}</li><li class="src short"><span class="keyword">data</span> <a href="#t:Layer">Layer</a> a = <a href="#v:Layer">Layer</a> {<ul class="subs"><li><a href="#v:weights">weights</a> :: Matrix a</li><li><a href="#v:biases">biases</a> :: Vector a</li></ul>}</li><li class="src short"><a href="#v:newNetwork">newNetwork</a> :: [Int] -&gt; IO (<a href="Network.html#t:Network">Network</a> Double)</li><li class="src short"><a href="#v:output">output</a> :: (Numeric a, Num (Vector a)) =&gt; <a href="Network.html#t:Network">Network</a> a -&gt; <a href="Network.html#t:ActivationFunction">ActivationFunction</a> a -&gt; Vector a -&gt; Vector a</li><li class="src short"><a href="#v:trainShuffled">trainShuffled</a> :: Int -&gt; (<a href="Network.html#t:Network">Network</a> Double -&gt; Int -&gt; String) -&gt; <a href="Network.html#t:Network">Network</a> Double -&gt; <a href="Network.html#t:CostFunction">CostFunction</a> -&gt; <a href="Network.html#t:Lambda">Lambda</a> -&gt; <a href="Network.html#t:Samples">Samples</a> Double -&gt; Int -&gt; Double -&gt; IO (<a href="Network.html#t:Network">Network</a> Double)</li><li class="src short"><a href="#v:trainNTimes">trainNTimes</a> :: Int -&gt; (<a href="Network.html#t:Network">Network</a> Double -&gt; Int -&gt; String) -&gt; <a href="Network.html#t:Network">Network</a> Double -&gt; <a href="Network.html#t:CostFunction">CostFunction</a> -&gt; <a href="Network.html#t:Lambda">Lambda</a> -&gt; <a href="Network.html#t:Samples">Samples</a> Double -&gt; Int -&gt; Double -&gt; <a href="Network.html#t:Network">Network</a> Double</li><li class="src short"><span class="keyword">data</span> <a href="#t:CostFunction">CostFunction</a><ul class="subs"><li>= <a href="#v:QuadraticCost">QuadraticCost</a></li><li>| <a href="#v:CrossEntropyCost">CrossEntropyCost</a></li></ul></li><li class="src short"><a href="#v:getDelta">getDelta</a> :: Floating a =&gt; <a href="Network.html#t:CostFunction">CostFunction</a> -&gt; a -&gt; a -&gt; a -&gt; a</li><li class="src short"><span class="keyword">type</span> <a href="#t:LearningRate">LearningRate</a> = Double</li><li class="src short"><span class="keyword">type</span> <a href="#t:Lambda">Lambda</a> = Double</li><li class="src short"><span class="keyword">type</span> <a href="#t:TrainingDataLength">TrainingDataLength</a> = Int</li><li class="src short"><span class="keyword">type</span> <a href="#t:Sample">Sample</a> a = (Vector a, Vector a)</li><li class="src short"><span class="keyword">type</span> <a href="#t:Samples">Samples</a> a = [<a href="Network.html#t:Sample">Sample</a> a]</li><li class="src short"><a href="#v:-45--45--62-">(--&gt;)</a> :: Vector a -&gt; Vector a -&gt; <a href="Network.html#t:Sample">Sample</a> a</li><li class="src short"><span class="keyword">type</span> <a href="#t:ActivationFunction">ActivationFunction</a> a = a -&gt; a</li><li class="src short"><span class="keyword">type</span> <a href="#t:ActivationFunctionDerivative">ActivationFunctionDerivative</a> a = a -&gt; a</li><li class="src short"><a href="#v:sigmoid">sigmoid</a> :: Floating a =&gt; <a href="Network.html#t:ActivationFunction">ActivationFunction</a> a</li><li class="src short"><a href="#v:sigmoid-39-">sigmoid'</a> :: Floating a =&gt; <a href="Network.html#t:ActivationFunctionDerivative">ActivationFunctionDerivative</a> a</li><li class="src short"><a href="#v:saveNetwork">saveNetwork</a> :: (Element a, Binary a) =&gt; FilePath -&gt; <a href="Network.html#t:Network">Network</a> a -&gt; IO ()</li><li class="src short"><a href="#v:loadNetwork">loadNetwork</a> :: (Element a, Binary a) =&gt; FilePath -&gt; IO (<a href="Network.html#t:Network">Network</a> a)</li></ul></div><div id="interface"><h1 id="g:1">Network</h1><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:Network" class="def">Network</a> a</p><div class="doc"><p>The generic feedforward network type, a binary instance is implemented.
  5. It takes a list of layers
  6. with a minimum of one (output layer).
  7. It is usually constructed using the <code><a href="Network.html#v:newNetwork">newNetwork</a></code> function.</p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:Network" class="def">Network</a></td><td class="doc empty">&nbsp;</td></tr><tr><td colspan="2"><div class="subs fields"><p class="caption">Fields</p><dl><dt class="src"><a name="v:layers" class="def">layers</a> :: [<a href="Network.html#t:Layer">Layer</a> a]</dt><dd class="doc empty">&nbsp;</dd></dl><div class="clear"></div></div></td></tr></table></div><div class="subs instances"><p id="control.i:Network" class="caption collapser" onclick="toggleSection('i:Network')">Instances</p><div id="section.i:Network" class="show"><table><tr><td class="src clearfix"><span class="inst-left">(Show a, Element a) =&gt; Show (<a href="Network.html#t:Network">Network</a> a)</span></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(Element a, Binary a) =&gt; Binary (<a href="Network.html#t:Network">Network</a> a)</span></td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:Layer" class="def">Layer</a> a</p><div class="doc"><p>One layer of a network, storing the weights matrix and the biases vector
  8. of this layer.</p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:Layer" class="def">Layer</a></td><td class="doc empty">&nbsp;</td></tr><tr><td colspan="2"><div class="subs fields"><p class="caption">Fields</p><dl><dt class="src"><a name="v:weights" class="def">weights</a> :: Matrix a</dt><dd class="doc empty">&nbsp;</dd><dt class="src"><a name="v:biases" class="def">biases</a> :: Vector a</dt><dd class="doc empty">&nbsp;</dd></dl><div class="clear"></div></div></td></tr></table></div><div class="subs instances"><p id="control.i:Layer" class="caption collapser" onclick="toggleSection('i:Layer')">Instances</p><div id="section.i:Layer" class="show"><table><tr><td class="src clearfix"><span class="inst-left">(Show a, Element a) =&gt; Show (<a href="Network.html#t:Layer">Layer</a> a)</span></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">(Element a, Binary a) =&gt; Binary (<a href="Network.html#t:Layer">Layer</a> a)</span></td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:newNetwork" class="def">newNetwork</a> :: [Int] -&gt; IO (<a href="Network.html#t:Network">Network</a> Double)</p><div class="doc"><p>Initializes a new network with random values for weights and biases
  9. in all layers.</p><pre>net &lt;- newNetwork [2, 3, 4]</pre></div></div><div class="top"><p class="src"><a name="v:output" class="def">output</a> :: (Numeric a, Num (Vector a)) =&gt; <a href="Network.html#t:Network">Network</a> a -&gt; <a href="Network.html#t:ActivationFunction">ActivationFunction</a> a -&gt; Vector a -&gt; Vector a</p><div class="doc"><p>Calculate the output of the network based on the network, a given
  10. <code><a href="Network.html#t:ActivationFunction">ActivationFunction</a></code> and the input vector.</p></div></div><h1 id="g:2">Learning functions</h1><div class="top"><p class="src"><a name="v:trainShuffled" class="def">trainShuffled</a> :: Int -&gt; (<a href="Network.html#t:Network">Network</a> Double -&gt; Int -&gt; String) -&gt; <a href="Network.html#t:Network">Network</a> Double -&gt; <a href="Network.html#t:CostFunction">CostFunction</a> -&gt; <a href="Network.html#t:Lambda">Lambda</a> -&gt; <a href="Network.html#t:Samples">Samples</a> Double -&gt; Int -&gt; Double -&gt; IO (<a href="Network.html#t:Network">Network</a> Double)</p><div class="doc"><p>The most used training function, randomly shuffling the training set before
  11. every training epoch</p><pre>trainShuffled 30 (\n e -&gt; &quot;&quot;) net CrossEntropyCost 0.5 trainData 10 0.1</pre></div></div><div class="top"><p class="src"><a name="v:trainNTimes" class="def">trainNTimes</a> :: Int -&gt; (<a href="Network.html#t:Network">Network</a> Double -&gt; Int -&gt; String) -&gt; <a href="Network.html#t:Network">Network</a> Double -&gt; <a href="Network.html#t:CostFunction">CostFunction</a> -&gt; <a href="Network.html#t:Lambda">Lambda</a> -&gt; <a href="Network.html#t:Samples">Samples</a> Double -&gt; Int -&gt; Double -&gt; <a href="Network.html#t:Network">Network</a> Double</p><div class="doc"><p>Pure version of <code><a href="Network.html#v:trainShuffled">trainShuffled</a></code>, training the network <em>n</em> times without
  12. shuffling the training set, resulting in slightly worse results.</p></div></div><div class="top"><p class="src"><span class="keyword">data</span> <a name="t:CostFunction" class="def">CostFunction</a></p><div class="doc"><p>Cost Function Enum</p></div><div class="subs constructors"><p class="caption">Constructors</p><table><tr><td class="src"><a name="v:QuadraticCost" class="def">QuadraticCost</a></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src"><a name="v:CrossEntropyCost" class="def">CrossEntropyCost</a></td><td class="doc empty">&nbsp;</td></tr></table></div><div class="subs instances"><p id="control.i:CostFunction" class="caption collapser" onclick="toggleSection('i:CostFunction')">Instances</p><div id="section.i:CostFunction" class="show"><table><tr><td class="src clearfix"><span class="inst-left">Eq <a href="Network.html#t:CostFunction">CostFunction</a></span></td><td class="doc empty">&nbsp;</td></tr><tr><td class="src clearfix"><span class="inst-left">Show <a href="Network.html#t:CostFunction">CostFunction</a></span></td><td class="doc empty">&nbsp;</td></tr></table></div></div></div><div class="top"><p class="src"><a name="v:getDelta" class="def">getDelta</a> :: Floating a =&gt; <a href="Network.html#t:CostFunction">CostFunction</a> -&gt; a -&gt; a -&gt; a -&gt; a</p><div class="doc"><p>getDelta based on the raw input, the activated input and the desired output
  13. results in different values depending on the CostFunction type.</p></div></div><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:LearningRate" class="def">LearningRate</a> = Double</p><div class="doc"><p>The learning rate, affects the learning speed, lower learning rate results
  14. in slower learning, but usually better results after more epochs.</p></div></div><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:Lambda" class="def">Lambda</a> = Double</p><div class="doc"><p>Lambda value affecting the regularization while learning.</p></div></div><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:TrainingDataLength" class="def">TrainingDataLength</a> = Int</p><div class="doc"><p>Wrapper around the training data length.</p></div></div><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:Sample" class="def">Sample</a> a = (Vector a, Vector a)</p><div class="doc"><p>Training sample that can be used for the training functions.</p><pre>trainingData :: Samples Double
  15. trainingData = [ fromList [0, 0] --&gt; fromList [0],
  16. fromList [0, 1] --&gt; fromList [1],
  17. fromList [1, 0] --&gt; fromList [1],
  18. fromList [1, 1] --&gt; fromList [0]]</pre></div></div><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:Samples" class="def">Samples</a> a = [<a href="Network.html#t:Sample">Sample</a> a]</p><div class="doc"><p>A list of <code><a href="Network.html#t:Sample">Sample</a></code>s</p></div></div><div class="top"><p class="src"><a name="v:-45--45--62-" class="def">(--&gt;)</a> :: Vector a -&gt; Vector a -&gt; <a href="Network.html#t:Sample">Sample</a> a</p><div class="doc"><p>A simple synonym for the (,) operator, used to create samples very intuitively.</p></div></div><h1 id="g:3">Activation functions</h1><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:ActivationFunction" class="def">ActivationFunction</a> a = a -&gt; a</p><div class="doc"><p>Activation function used to calculate the actual output of a neuron.
  19. Usually the <code><a href="Network.html#v:sigmoid">sigmoid</a></code> function.</p></div></div><div class="top"><p class="src"><span class="keyword">type</span> <a name="t:ActivationFunctionDerivative" class="def">ActivationFunctionDerivative</a> a = a -&gt; a</p><div class="doc"><p>The derivative of an activation function.</p></div></div><div class="top"><p class="src"><a name="v:sigmoid" class="def">sigmoid</a> :: Floating a =&gt; <a href="Network.html#t:ActivationFunction">ActivationFunction</a> a</p><div class="doc"><p>The sigmoid function</p></div></div><div class="top"><p class="src"><a name="v:sigmoid-39-" class="def">sigmoid'</a> :: Floating a =&gt; <a href="Network.html#t:ActivationFunctionDerivative">ActivationFunctionDerivative</a> a</p><div class="doc"><p>The derivative of the sigmoid function.</p></div></div><h1 id="g:4">Network serialization</h1><div class="top"><p class="src"><a name="v:saveNetwork" class="def">saveNetwork</a> :: (Element a, Binary a) =&gt; FilePath -&gt; <a href="Network.html#t:Network">Network</a> a -&gt; IO ()</p><div class="doc"><p>Saves the network as the given filename. When the file already exists,
  20. it looks for another filename by increasing the version, e.g
  21. <em>mnist.net</em> becomes <em>mnist1.net</em>.</p></div></div><div class="top"><p class="src"><a name="v:loadNetwork" class="def">loadNetwork</a> :: (Element a, Binary a) =&gt; FilePath -&gt; IO (<a href="Network.html#t:Network">Network</a> a)</p><div class="doc"><p>Load the network with the given filename.</p></div></div></div></div><div id="footer"><p>Produced by <a href="http://www.haskell.org/haddock/">Haddock</a> version 2.16.1</p></div></body></html>