我正在使用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}}更改为相同的结果。
答案 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]
也可能会有所帮助。
注意:您发现的这种代码风格虽然写起来很有趣,但是对于其他人来说却是一个挑战,我通常不建议您以这种方式编写代码,除非是出于乐趣。