Python 如何在神经网络模型中正确初始化所需的向量?

Python 如何在神经网络模型中正确初始化所需的向量?,python,numpy,neural-network,Python,Numpy,Neural Network,我正在尝试用Python从头开始实现一个神经网络模型(使用Numpy)。作为参考,我使用了《从数据中学习》(Abu Mostafa教授)的e-7章作为理论支持 我面临的第一个问题是如何正确初始化权重矩阵以及输入和输出向量(分别是W、x和s) 以下是我的方法: 设L为层数(不计算“第一”层,即向量x的层加上“偏差”) 让d成为隐藏层的维度(我假设所有隐藏层都有相同数量的节点) 设out为最后一层的节点数(通常为1) 现在,我是如何定义矩阵和感兴趣的向量的: 设w_为权重向量。实际上,它是一个

我正在尝试用Python从头开始实现一个神经网络模型(使用Numpy)。作为参考,我使用了《从数据中学习》(Abu Mostafa教授)的e-7章作为理论支持

我面临的第一个问题是如何正确初始化权重矩阵以及输入和输出向量(分别是W、x和s)

以下是我的方法:

  • L
    为层数(不计算“第一”层,即向量x的层加上“偏差”)
  • d
    成为隐藏层的维度(我假设所有隐藏层都有相同数量的节点)
  • out
    为最后一层的节点数(通常为1)
现在,我是如何定义矩阵和感兴趣的向量的:

  • w_
    为权重向量。实际上,它是一个向量,其中每个分量都是一个W_{L}形式的矩阵。这里,(i,j)-th值是w{i,j}^{(L)}项
  • x
    为输入向量
  • s
    为输出向量;您可以将
    s
    视为
    numpy.dot(W^{L}.T,x^{L-1})
下图总结了我刚才描述的内容:

问题产生于每个层(输入层、隐藏层和输出层)的尺寸不相同的事实。我想做的是把每个向量分成不同的变量;但是,在算法的以下步骤中使用它是非常困难的(因为索引变得一团糟)。下面是一段复制我尝试的代码:

class NeuralNetwork:
    """
    Neural Network Model
    """
    def __init__(self, L, d, out):
        self.L = L # number of layers
        self.d = d # dimension of hidden layers
        self.out = out # dimension of the output layer

    def initialize_(self, X): 
        # Initialize the vector of inputs
        self.x_ = np.zeros((self.L - 1) * (self.d + 1)).reshape(self.L - 1, self.d + 1)
        self.xOUT_ = np.zeros(1 * self.out).reshape(1, self.out)

        # Initialize the vector of outputs
        self.s_ = np.zeros((self.L - 1) * (self.d)).reshape(self.L - 1, self.d)
        self.sOUT_ = np.zeros(1 * self.out).reshape(1, self.out)

        # Initialize the vector of weights
        self.wIN_  = np.random.normal(0, 0.1, 1 * (X.shape[1] + 1) * self.d).reshape(1, X.shape[1] + 1, self.d)
        self.w_ = np.random.normal(0, 0.1, (self.L - 2) * (self.d + 1) * self.d).reshape(self.L - 2, self.d + 1, self.d)
        self.wOUT_ = np.random.normal(0, 0.1, 1 * (self.d + 1) * self.out).reshape(1, self.d + 1, self.out) 

    def fit(self, X, y):
        self.initialize_(X)
每当代码中出现
IN
OUT
时,这就是我分别处理输入层和输出层之间维度差异的方法

显然,这不是一个好办法。所以我的问题是:我如何巧妙地处理这些不同的维度向量(关于每一层)

例如,在初始化它们之后,我想复制以下算法(正向传播)-您将看到,使用我的索引方式,这几乎是不可能的:

其中\theta(s)=\tanh(s)


附言:我还试图创建一个数组(或列表数组),但如果我这样做,我的索引将变得无用-它们不再代表我希望它们代表的内容。

您可以封装神经元逻辑,让神经元单独执行计算:

class Neuron:
    def __init__(self, I, O, b):
        self.I = I # input neurons from previous layer
        self.O = O # output neurons in next layer
        self.b = b # bias

    def activate(self, X):
        output = np.dot(self.I, X) + self.b
        ...
        return theta(output)

顺便说一句,
无需重塑
数组,例如
np.zero(1*self.out)。重塑(1,self.out)
可以替换为
np.zero((1,self.out))
等。这将使代码更干净。