Входной операнд 1 имеет несоответствие в своем основном измерении 0, с сигнатурой gufunc (n?,k),(k,m?)->(n?,m?) (размер 1 отличается от 750)

#python #deep-learning

Вопрос:

Я делаю эту модель, закодированную, как показано ниже, но получаю эту ошибку. Это векторизованная двоичная сеть прямой передачи. Когда я векторизировал только веса, это сработало. В этом я векторизировал как входные данные, так и веса. Я все еще новичок и учусь программировать. Я хотел бы знать, как преодолеть эту ошибку. Мой код приведен ниже:

 ValueError                                Traceback (most recent call last)
<ipython-input-56-12a26d8a87b0> in <module>()
      1 ffb =FF_binary_Vector_iw(W1,W2)
----> 2 ffb.fit(X_train, Y_train, epochs=2000, learning_rate=0.85, display_loss=True)

1 frames
<ipython-input-55-4f12b1e86a1b> in grad(self, X, Y)
     30     self.dW2 = np.matmul(self.H1.T, self.dA2) # (2, 1) * (1, 1) -> (2, 1)
     31     self.dB2 = self.dA2 # (1, 1)
---> 32     self.dH1 = np.matmul(self.dA2, self.W2.T) # (1, 1) * (1, 2) -> (1, 2)
     33     self.dA1 = np.multiply(self.dH1, self.grad_sigmoid(self.H1)) # -> (1, 2)
     34 

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 1 is different from 750)
 
 data, labels = make_blobs(n_samples=1000, centers=4, n_features=2, random_state=0)
print(data.shape, labels.shape)

labels_orig = labels
labels = np.mod(labels_orig, 2)

X_train, X_val, Y_train, Y_val = train_test_split(data, labels, random_state=0)
print(X_train.shape, X_val.shape, labels.shape)

W1 = np.random.randn(2,2)
W2 = np.random.randn(2,1)
print(W1)
print(W2)

class FF_binary_Vector_iw:
  
  def __init__(self, W1, W2):
    self.W1 = W1.copy()
    self.W2 = W2.copy()
    self.B1 = np.zeros((1,2))
    self.B2 = np.zeros((1,1))       
  
  def sigmoid(self, X):
    return 1.0/(1.0   np.exp(-X))
  
  def forward_pass(self, X):
    #X = X.reshape(1, -1) # (1, 2)
    self.A1 = np.matmul(X,self.W1)   self.B1  # (1, 2) * (2, 2) -> (1, 2)
    self.H1 = self.sigmoid(self.A1) # (1, 2)
    self.A2 = np.matmul(self.H1, self.W2)   self.B2 # (1, 2) * (2,1) -> (1, 1) 
    self.H2 = self.sigmoid(self.A2) # (1, 1)
    return self.H2
   
  def grad_sigmoid(self, x):
    return X*(1-X)   
  
  def grad(self, X, Y):
    self.forward_pass(X)
    X = X.reshape(1, -1) # (1, 2)      
    self.dA2 = self.H2 - Y # (1, 1)     
    self.dW2 = np.matmul(self.H1.T, self.dA2) # (2, 1) * (1, 1) -> (2, 1)
    self.dB2 = self.dA2 # (1, 1)
    self.dH1 = np.matmul(self.dA2, self.W2.T) # (1, 1) * (1, 2) -> (1, 2)
    self.dA1 = np.multiply(self.dH1, self.grad_sigmoid(self.H1)) # -> (1, 2)    
    self.dW1 = np.matmul(X.T, self.dA1) # (2, 1) * (1, 2) -> (2, 2)
    self.dB1 = self.dA1 # (1, 2)   
    
  
  def fit(self, X, Y, epochs=1, learning_rate=1, display_loss=False):
      
    if display_loss:
      loss = {}    
    for i in tqdm_notebook(range(epochs), total=epochs, unit="epoch"):
      self.grad(X, Y) # X -> (N, 2), Y -> (N, 4)   
        
      m = X.shape[0]
      self.W2 -= learning_rate * (dW2/m)
      self.B2 -= learning_rate * (dB2/m)
      self.W1 -= learning_rate * (dW1/m)
      self.B1 -= learning_rate * (dB1/m)

      if display_loss:
        Y_pred = self.predict(X)
        loss[i] = mean_squared_error(Y_pred,Y)
        
    
    if display_loss:
      plt.plot(np.array(list(loss.values())).astype(float))
      plt.xlabel('Epochs')
      plt.ylabel('Log Loss')
      plt.show()
      
      
  def predict(self, X):
    Y_pred = self.forward_pass(X)    
    return np.array(Y_pred).squeeze()

ffb =FF_binary_Vector_iw(W1,W2)
ffb.fit(X_train, Y_train, epochs=2000, learning_rate=0.85, display_loss=True)

Please help. Thank You