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) not aligned: 1 (dim 1) != 4 (dim 0)
Расчет работы в массиве numpy, но не в матрице numpy
Почему матрица не работает в коде?
'np.matrix' является подклассом' np.array' (ndarray), который выглядит несколько как матрица MATLAB. Он всегда 2d и использует '*' для продукта 'dot'. Если вам действительно не нужно его использовать, придерживайтесь 'array. Является ли 'x * (1 - x)' элементом элементным продуктом или матричным (точка) продуктом. Если 'x' не является квадратным, он будет иметь проблемы с размерностью. – hpaulj
Потому что 'matrix' собирается попытаться использовать умножение матрицы, а не умножить на элементы? – mgilson