当前位置:嗨网首页>书籍在线阅读

12-神经元的实现

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

7.4.1 神经元的实现

先从神经元开始吧。一个神经元对象将会保存很多状态,包括其权重、delta、学习率、最近一次输出的缓存、激活函数及其导数等。其中某些内容如果保存在高一个级别的对象中(后续的 Layer 类中),性能可能会更好,但为了演示,它们还是被包含在代码清单7-3的 Neuron 类中。

代码清单7-3 neuron.py(续)

from typing import List, Callable
from util import dot_product
class Neuron:
    def __init__(self, weights: List[float], learning_rate: float, activation_function:
      Callable[[float], float], derivative_activation_function: Callable[[float], 
      float]) -> None:
      self.weights: List[float] = weights
      self.activation_function: Callable[[float], float] = activation_function
      self.derivative_activation_function: Callable[[float], float] = derivative_
        activation_function
      self.learning_rate: float = learning_rate
      self.output_cache: float = 0.0
      self.delta: float = 0.0
    def output(self, inputs: List[float]) -> float:
        self.output_cache = dot_product(inputs, self.weights)
        return self.activation_function(self.output_cache)

大多数参数都在 __init__() 方法中完成初始化。因为在首次创建 Neuron 时, deltaoutput_cache 是未知的,所以只是将它们初始化为 0 。所有神经元的变量都是可变的。在神经元的生命周期中,它们的值可能永远都不会发生变化(即将如此运用),但为了保持灵活性还是设为可变为好。如果这个 Neuron 类将与其他类型的神经网络一起合作,则其中某些值可能会在运行中发生变化。有一些神经网络可以在求解过程中改变学习率,并自动尝试各种不同的激活函数。这里我们将努力让 Neuron 类保持最大的灵活性,以便适应其他的神经网络应用。

__init__() 之外, Neuron 类只有一个 output() 方法。 output() 的参数为进入神经元的输入信号( inputs ),它调用本章的前面讨论过的公式(如图7-2所示)。输入信号通过点积操作与权重合并在一起,并在 output_cache 中留了一份缓存数据。回想一下介绍反向传播的章节,在应用激活函数之前获得的这个值将用于计算delta。最后,信号被继续发送给下一层(从 output() 返回)之前,将对其应用激活函数。

就这些了!这个神经网络中的神经元个体非常简单,除了读取输入信号、对其进行转换并发送结果以供进一步处理,它不做别的事情。它维护着供其他类使用的几种状态数据。