from numpy import exp, array, random, dot, matrix, asarray
class NeuralNetwork():
def __init__(self):
random.seed(1)
self.synaptic_weights = 2 * random.random((3, 1)) - 1 # init weight from -1 to 1
def __sigmoid(self, x):
return 1 / (1 + exp(-x))
def __sigmoid_derivative(self, x):
return x * (1 - x)
def train(self, train_input, train_output, iter):
for i in range(iter):
output = self.think(train_input)
error = train_output - output
adjustment = dot(train_input.T, error * self.__sigmoid_derivative(output))
self.synaptic_weights += adjustment
def think(self, inputs):
return self.__sigmoid(dot(inputs, self.synaptic_weights))
neural_network = NeuralNetwork()
train = matrix([[0, 0, 1, 0],[1, 1, 1, 1],[1, 0, 1, 1],[0, 1, 1, 0]])
train_input = asarray(train[:, 0:3])
train_output = asarray(train[:,3])
neural_network.train(train_input, train_output, 10000)
这段代码是一个基本的神经网络。当我使用 asarray
转换训练集时,它效果很好,但它本身不适用于矩阵。矩阵似乎无法计算 sigmoid_derivative,终端显示 ValueError: Shapes (4,1) and (4,1) notaligned: 1 (dim 1) != 4 (dim 0)
为什么矩阵在代码中不起作用?
最佳答案
错误出现在
x * (1 - x)
表达式。 x
是 (4,1) 形状。通过数组逐个元素相乘,此 x*(1-x)
工作正常,返回另一个 (4,1) 结果。
但是如果x
是一个(4,1)矩阵,那么*
就是矩阵乘积,对于数组来说同样的np.dot
。这需要 (4,1) * (1,4) => (4,4) 或 (1,4)*(4,1)=>(1,1)。您已经在使用 dot
进行矩阵乘积,因此该导数是明确的元素明智导数。
如果您看到使用 np.matrix
的机器学习代码,它可能基于较旧的示例,并保留 matrix
以实现向后兼容性。最好使用array
,并根据需要使用dot
乘积。
关于python - 计算适用于 numpy 数组,但不适用于 numpy 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42358737/