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 шт):
У вас проблема не в умножении, а в сложении.
Умножение np.dot(np.transpose(inputs),deltah) даёт массив размером (3,3), а произведение np.dot(np.transpose(inputs),deltah[:,:-1]) дает массив размером (3,2)
Соответственно, если у вас inputw1 имеет размер (3,2), то сложение c массивом размером (3,3) выдаёт ошибку.