得墨忒耳定律 - 需要内部表示?

时间:2014-12-09 21:00:34

标签: python oop design-patterns

想象一下,我们有一个班级“NeuralNetwork”

  • 每个NeuralNetwork由图层
  • 组成
  • 每层由神经元组成
  • 每个神经元由权重,偏差和激活函数组成

    class Neuron:
        def __init__(self,weights,bias,activation):
            self._weights = weights
            self._bias = bias
            self._activation = activation
    
        def activate(self,input):
            return self._activation.compute(self._weights.dot(input)+self._bias)
    
    
    class Layer:
        def __init__(self,neurons):
            self._neurons = neurons
    
        def compute(self,input):
            output = []
            for neuron in self._neurons:
                output.append(neuron.activate(input))
            return output
    
    
    class NeuralNetwork:
        def __init__(self,layers):
            self._layers = layers
    
        def compute(self,input):
            output = input
            for layer in self._layers:
                output = layer.compute(output)
            return output
    
        def train(self,dataset):
            # do some training
            # changes the neurons inside the layers
    

NeuralNetwork有一个方法train()来改变它的内部表示。 但这意味着可以访问Layer对象的内部。它需要访问单个神经元,违反了demeter的规律。 例如

layers[0].getNeuron(0).compute(input)

layer[0].getNeuron(0).changeBias(2)

我能想到的唯一解决方案是在“Layer”中提供额外的方法并将其委托给神经元。这也允许我使用Layer接口的不同实现。一个更灵活,一个具有更好的性能。

但这看起来很麻烦。是不是有更好的方法来模拟这个?

enter image description here

1 个答案:

答案 0 :(得分:0)

第一种可能的解决方案是添加一些委托方法。

从Amr Mostafa的评论中提取的第二个解决方案是通过Layer对象向神经元发送事件。

两种解决方案都允许我们使用不同的Layer对象,该对象由多维数组而不是神经元对象组成(性能考虑)。

enter image description here