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