2017-02-21 14 views
1
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

Почему матрица не работает в коде?

+0

'np.matrix' является подклассом' np.array' (ndarray), который выглядит несколько как матрица MATLAB. Он всегда 2d и использует '*' для продукта 'dot'. Если вам действительно не нужно его использовать, придерживайтесь 'array. Является ли 'x * (1 - x)' элементом элементным продуктом или матричным (точка) продуктом. Если 'x' не является квадратным, он будет иметь проблемы с размерностью. – hpaulj

+1

Потому что 'matrix' собирается попытаться использовать умножение матрицы, а не умножить на элементы? – mgilson

ответ

2

Ошибка в выражении в

x * (1 - x) 

. x есть (4,1) форма. С умножением элемента массива на элемент, этот x*(1-x) отлично работает, возвращая другой результат (4,1).

Но если x является (4,1) матрицей, то * является матричным продуктом, то же самое np.dot для массивов. Для этого потребовалось бы (4,1) * (1,4) => (4,4) или a (1,4) * (4,1) => (1,1). Вы уже используете dot для матричного продукта, поэтому эта производная понятна элементарной.

Если вы видите код обучения, который использует np.matrix, он, вероятно, основан на более старых примерах и сохраняет matrix для обратной совместимости. Лучше использовать array и при необходимости использовать продукт dot.