gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:49:24 29 4
gpt4 key购买 nike

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

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

这是我的方法:

  • L是层数(您不计算“第一”层;即向量 x 的层加上“偏差”)。
  • d是隐藏层的维度(我假设所有隐藏层具有相同数量的节点)。
  • out是最后一层的节点数(通常为 1)。

  • 现在,这是我如何定义感兴趣的矩阵和向量:
  • w_是权重的向量。实际上,它是一个向量,其中每个分量都是 W_{L} 形式的矩阵。这里,第 (i, j) 值是 w_{i, j}^{(L)} 项。
  • x_是输入向量。
  • s_是输出的向量;你可能会看到 s_numpy.dot(W^{L}.T, x^{L-1}) .

  • 下图总结了我刚刚描述的内容:

    A pair of nodes with the proper notation for each component.

    问题源于每一层(输入、隐藏层和输出)的维度不相同。我想做的是将每个向量分成不同的变量;然而,在算法的以下步骤中使用它是非常困难的(因为索引变得一团糟)。这是复制我的尝试的一段代码:
    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)

    每当 INOUT出现在代码中,这是我分别处理输入和输出层之间维度差异的方式。

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

    例如,在初始化它们之后,我想重现以下算法(前向传播)——你会看到,用我的索引方式,这几乎是不可能的:

    Forward Propagation Algorithm

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

    P.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)

    关于python - 如何在神经网络模型中正确初始化所需的向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59550711/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com