#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