2017-02-21 60 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'產品。如果你真的不需要使用它,堅持'數組。 x *(1-x)是元素乘積還是矩陣(點)乘積。除非'x'是正方形,否則會產生尺寸問題。 – hpaulj

+1

因爲'矩陣'會嘗試使用矩陣乘法而不是元素乘法? – mgilson

回答

2

的錯誤是在

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產品。