具有两个功能的fmap

时间:2018-07-15 16:48:06

标签: haskell neural-network feed-forward

我正在使用haskell编写神经网络。我将代码基于此http://www-cs-students.stanford.edu/~blynn/haskell/brain.html。 我通过以下方式修改了前馈方法:

feedForward :: [Float] -> [([Float], [[Float]])] -> [Float]
feedForward = foldl ((fmap tanh . ) . previousWeights)

以前的重量是:

previousWeights :: [Float] -> ([Float], [[Float]]) -> [Float]
previousWeights actual_value (bias, weights) = zipWith (+) bias (map (sum.(zipWith (*) actual_value)) weights)

我不太了解fmap tanh .从我读到的内容来看,将fmap应用于两个函数就像是一个合成。如果我将fmap的{​​{1}}更改为相同的结果。

1 个答案:

答案 0 :(得分:1)

如果我们给参数名称并删除连续的.,则更容易阅读:

feedForward :: [Float] -> [([Float], [[Float]])] -> [Float]
feedForward actual_value bias_and_weights =
  foldl
  (\accumulator -- the accumulator, it is initialized as actual_value
    bias_and_weight -> -- a single value from bias_and_weights
     map tanh $ previousWeights accumulator bias_and_weight)
  actual_value -- initialization value
  bias_and_weights -- list we are folding over

了解foldl的类型签名在这种情况下为([Float] -> ([Float], [[Float]])-> [Float]) -> [Float] -> [([Float], [[Float]])] -> [Float]也可能会有所帮助。

注意:您发现的这种代码风格虽然写起来很有趣,但是对于其他人来说却是一个挑战,我通常不建议您以这种方式编写代码,除非是出于乐趣。