operands could not be broadcast together with shapes (3,3) (3,2)

Пытаюсь разобраться с многослойным персептроном при обратном распространении считаю ошибки и корректирую веса. вывожу размерность входных данных (inputs). = (150,3) и соответственно (3,150) при транспонировании

deltah также имеет размерность (150,3)

hidden1 тоже

в итоге, когда пытаюсь запустить код:

                deltah = hidden1*beta*(1.0-hidden1)*(np.dot(deltao,np.transpose(weights2)))     #  ошибки скрытых  нейронов
     58         print("deltah ", deltah, "\t", "shape", deltah.shape)
---> 59         updatew1 = teta*(np.dot(np.transpose(inputs),deltah)) + Alfa*updatew1    # корр. весов
     60         print("trans", np.transpose(inputs).shape)
     61         print("inputs", inputs, "updatew1", updatew1)

получаю ошибкуoperands could not be broadcast together with shapes (3,3) (3,2) на участке выше но, когда вместо updatew1 = teta*(np.dot(np.transpose(inputs),deltah)) + Alfa*updatew1пишу

updatew1 = teta*(np.dot(np.transpose(inputs),deltah[:, :-1])) + Alfa*updatew1

все прекрасно, хотя по идее, deltah[:, :-1]- матрица, за исключением последнего столбца

shape у deltah[:, :-1] получается (150, 2)

по моей логике, (3, 150) * (150, 3) лучше, чем (3, 150) * (150, 2), но видимо нет. помогите распутаться :)


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

Автор решения: Pak Uula

У вас проблема не в умножении, а в сложении.

Умножение np.dot(np.transpose(inputs),deltah) даёт массив размером (3,3), а произведение np.dot(np.transpose(inputs),deltah[:,:-1]) дает массив размером (3,2)

Соответственно, если у вас inputw1 имеет размер (3,2), то сложение c массивом размером (3,3) выдаёт ошибку.

→ Ссылка