Python 神经网络中的权值
我正在读: 我看到了以下代码:Python 神经网络中的权值,python,machine-learning,neural-network,Python,Machine Learning,Neural Network,我正在读: 我看到了以下代码: import numpy as np def sigmoid(x): return 1.0/(1+ np.exp(-x)) def sigmoid_derivative(x): return x * (1.0 - x) class NeuralNetwork: def __init__(self, x, y): self.input = x self.weights1 = np.rando
import numpy as np
def sigmoid(x):
return 1.0/(1+ np.exp(-x))
def sigmoid_derivative(x):
return x * (1.0 - x)
class NeuralNetwork:
def __init__(self, x, y):
self.input = x
self.weights1 = np.random.rand(self.input.shape[1],4)
self.weights2 = np.random.rand(4,1)
self.y = y
self.output = np.zeros(self.y.shape)
def feedforward(self):
self.layer1 = sigmoid(np.dot(self.input, self.weights1))
self.output = sigmoid(np.dot(self.layer1, self.weights2))
def backprop(self):
# application of the chain rule to find derivative of the loss function with respect to weights2 and weights1
d_weights2 = np.dot(self.layer1.T, (2*(self.y - self.output) * sigmoid_derivative(self.output)))
d_weights1 = np.dot(self.input.T, (np.dot(2*(self.y - self.output) * sigmoid_derivative(self.output), self.weights2.T) * sigmoid_derivative(self.layer1)))
# update the weights with the derivative (slope) of the loss function
self.weights1 += d_weights1
self.weights2 += d_weights2
if __name__ == "__main__":
X = np.array([[0,0,1],
[0,1,1],
[1,0,1],
[1,1,1]])
y = np.array([[0],[1],[1],[0]])
nn = NeuralNetwork(X,y)
for i in range(1500):
nn.feedforward()
nn.backprop()
print(nn.output)
权重不应该是4x4随机矩阵吗?因为我们在隐藏层中有4个神经元和4个输入值,所以权重的总数应该是16,但是下面的代码在init函数中分配了一个2x4的矩阵,并创建了一个点积?您的输入矩阵X表明样本数是4,特征数是3。神经网络输入层中的神经元数等于特征数*,而不是样本数。例如,考虑到你有4辆车,你选择了3个特点为每一个:颜色,座位数量和原产地国。对于每个汽车样本,您将这3个功能提供给网络并训练您的模型。即使你有4000个样本,输入神经元的数量也不会改变;现在是3点
因此self.weights1的形状是3,4,其中3是特征数,4是隐藏神经元数,这4与样本数无关,正如预期的那样
*:有时输入会增加1或-1以说明偏差,因此在这种情况下,输入神经元的数量将为num_features+1;但这是一个选择,是否单独处理偏见。您的输入矩阵X表明样本数为4,特征数为3。神经网络输入层中的神经元数等于特征数*,而不是样本数。例如,考虑到你有4辆车,你选择了3个特点为每一个:颜色,座位数量和原产地国。对于每个汽车样本,您将这3个功能提供给网络并训练您的模型。即使你有4000个样本,输入神经元的数量也不会改变;现在是3点
因此self.weights1的形状是3,4,其中3是特征数,4是隐藏神经元数,这4与样本数无关,正如预期的那样
*:有时输入会增加1或-1以说明偏差,因此在这种情况下,输入神经元的数量将为num_features+1;但这是一个选择,是否单独处理偏差。这个网络中只有一个隐藏层和一个输出层,而不是四个。对不起,我指的是隐藏层中的四个神经元。这个网络中只有一个隐藏层和一个输出层,而不是四个。对不起,我指的是隐藏层中的四个神经元。谢谢,这帮了大忙,多个在线教程使用与输入层中神经元数量相同的输入数量。我从你的回答中了解到,是输入中的列数决定了输入层的大小。如果我理解正确,请告诉我。是的,特征的数量总是决定输入神经元的数量。设计矩阵X的通常约定是具有shape num_样本,num_特征,因此是的,它通常是输入矩阵的列数。看来你们明白了。谢谢你们,这很有帮助,多个在线教程使用了和输入层中神经元数量相同的输入数量。我从你的回答中了解到,是输入中的列数决定了输入层的大小。如果我理解正确,请告诉我。是的,特征的数量总是决定输入神经元的数量。设计矩阵X的通常约定是具有shape num_样本,num_特征,因此是的,它通常是输入矩阵的列数。看来你明白了。