Haskell Artificial Neural Networking library
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

21 řádky
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>