1

我用haskell写了一个神经网络。我的代码基于此http://www-cs-students.stanford.edu/~blynn/haskell/brain.html。我通过以下方式调整了前馈方法:

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

previousWeights 是:

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

我真的不明白fmap tanh .从我读到的 fmap 应用于两个函数的内容就像一个组合。如果我更改fmapformap我会得到相同的结果。

4

1 回答 1

2

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

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].

注意:您发现的这种代码风格虽然写起来很有趣,但对其他人来说阅读起来可能是一个挑战,如果不是为了好玩,我通常不建议您这样写。

于 2019-11-19T16:39:27.050 回答