python numpy: транспонирование вектора строк

#python #numpy #backpropagation

Вопрос:

Предположим, у меня есть матрица 2 на 2 w = np.array([[1, 2], [3, 4]]) и массив x = np.array([5, 6]) . Если я запущу y = np.dot(w, x) , то y-это другой массив np.array([17, 39]) . Здесь все хорошо, хотя на самом деле мы знаем x , что при расчете используется вектор столбцов, и вывод y также должен быть вектором столбцов.

Во время обратного распространения градиент w is grad @ x.T , где @ является умножением матрицы , x.T транспонируется x и grad представляет собой массив, который имеет ту же форму , что и y, но заполнен 1: grad = np.ones_like(y) .

В идеале, grad должен быть вектор 2 на 1 и вектор x.T строк 1 на 2, поэтому результатом является матрица 2 на 2, того же размера, что и w. Однако оба grad и x являются 1-D массивами, поэтому результатом становится одно число.

Есть ли какие-то решения? Спасибо за любую помощь!

Комментарии:

1. В numpy терминах x это 1d массив. Это не «вектор столбцов». np.dot четко определяет, что он делает, когда аргумент равен 1d. x.T изменяет (одно) измерение(измерения) x ; он не добавляет измерение. Любопытно, почему вы используете np.dot и в одном, и @ в другом?

2. Мои ошибки. Но в данном случае все они приводят к одному и тому же результату. независимо от того, использую ли я@, точку или matmul

3. Любыми способами, если x действительно (2,1), то x.T будет (1,2), и последнее вычисление даст (2,2). A (2,1)@ с a (1,2) также является «внешним» продуктом или транслируется по элементам, поскольку добавляется только измерение размера 1.

4. Обычно массивы данных ML-вопросов представляют собой 2d (n-образцы, n-объекты). Таким образом,даже если есть только одна функция, массив будет (n, 1). Форма (n,) распространена в numpy и для трансляции действует как (1, n), но изменение формы на (n, 1) также легко и используется по мере необходимости.