Почему ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?)?

Пишу код для нейросети. При перемножении матриц получаю ошибку:

Traceback (most recent call last):
  File "/home/dgdays/neural_network/learner.py", line 71, in <module>
    dE_dw3 = h2.T @ dE_dt3
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 10)

Понимаю, что что-то не так при перемножении матрицы h2 транспонированной и матрицы dE_dt3. Но не совсем понимаю почему так выходит... Подскажите, пожалуйста.

Матрицы:

h2 = [ 52.39308215   0.           0.           0.           0.
   0.         114.58691423   0.           0.          24.43782115]
h2.T = [ 52.39308215   0.           0.           0.           0.
   0.         114.58691423   0.           0.          24.43782115] # Транспонированная h2 (хотя отличий от h2 не вижу -_-)
dE_dt3 = [[-1.  1.]]

Код нейронки:

from os import sep
import numpy as np
from numpy import random
from numpy.core.fromnumeric import argmax
from numpy.core.numeric import outer
import random
from pandas import read_csv
import matplotlib.pyplot as plt

# Входные значения

data = read_csv('/home/dgdays/neural_network/data.csv', sep=';')

gender, height, weight = data['Gender'], data['Height'], data['Weight']

loss_arr = []

INPUT_DIM = 2
OUT_DIM = 2
H1_DIM = 5
H2_DIM = 10

# Веса и смещение
w1 = np.random.randn(INPUT_DIM, H1_DIM)
b1 = np.random.randn(H1_DIM)
w2 = np.random.randn(H1_DIM, H2_DIM)
b2 = np.random.randn(H2_DIM)
w3 = np.random.randn(H2_DIM, OUT_DIM)
b3 = np.random.randn(OUT_DIM)

ALPHA = 0.001
NUM_EPOCHS = 100

def relu(t):
    return np.maximum(t, 0)

def softmax(t):
    out = np.exp(t)
    return out / np.sum(out)

def sparse_cross_entropy(z, y):
    return -np.log(z[y])

def to_full(y, num_classes):
    y_full = np.zeros((1, num_classes))
    y_full[0, y] = 1
    return y_full

def relu_deriv(t):
    return (t >= 0).astupe(float)

for ep in range(NUM_EPOCHS):
    for i in range(len(gender)):

        x, y = np.array((height[i], weight[i])), gender[i]
        x = np.around(x, 3)
        # Forward
        t1 = x @ w1 + b1
        h1 = relu(t1)
        t2 = h1 @ w2 + b2
        h2 = relu(t2)
        t3 = h2 @ w3 + b3
        z = softmax(t3)
        E = sparse_cross_entropy(z, y)

        # Backward
        y_full = to_full(y, OUT_DIM)
        dE_dt3 = z - y_full
        dE_dw3 = h2.T @ dE_dt3
        dE_db3 = dE_dt3
        dE_dh2 = dE_dt3 @ w2.T
        dE_dt2 = dE_dh2 * relu_deriv(t2)
        dE_dw2 = h1.T @ dE_dt2
        dE_db2 = dE_dt2
        dE_dh1 = dE_dt2 @ w1.T
        dE_dt1 = dE_dh1 * relu_deriv(t1)
        dE_dw1 = x.T @ dE_dt1
        dE_db1 = dE_dt1


        # Update
        w1 = w1 - ALPHA * dE_dw1
        b1 = b1 - ALPHA * dE_db1
        w2 = w2 - ALPHA * dE_dw2
        b2 = b2 - ALPHA * dE_db2
        w3 = w3 - ALPHA * dE_dw3
        b3 = b3 - ALPHA * dE_db3

        loss_arr.append(E)

def predict(x):
    t1 = x @ w1 + b1
    h1 = relu(t1)
    t2 = h1 @ w2 + b2
    h2 = relu(t2)
    t3 = h2 @ w3 + b3
    z = softmax(t3)
    return z

def calc_accuracy():
    correct = 0
    for i in range(len(gender)):
        x, y = np.array((height[i], weight[i])), gender[i]
        z = predict(x)
        y_pred = np.argmax(z)
        if y_pred == y:
            correct += 1

    acc = correct / len(gender)
    return acc

accuracy = calc_accuracy()
print('Accuracy: ', accuracy)

plt.plot(loss_arr)
plt.show()

Ссылка на датасет: https://drive.google.com/file/d/1Qn4io0WXNk9gAZkEF3UYyorHElLlHUg1/view?usp=sharing


Ответы (0 шт):