np.dot ошибочно изменен с умножения матрицы на поэлементное произведение

#python

#python

Вопрос:

 with tf.Session() as test:
    A = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3])
    print(A.shape)
    print(A.eval())
    G = np.dot(A,A)
    print(G.shape)
    print(G.eval())
  

Как показано на странице, в для тензоров np.dot изменился с умножения матрицы на поэлементное произведение, но np.dot никогда не упоминал об этом. Кто-нибудь может помочь объяснить, почему? Большое вам спасибо

Результат

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

1. Какую версию tensorflow и numpy вы используете? np.dot(A, A) на прямоугольной матрице A должен произойти сбой. Я не могу воспроизвести ваш пример. Если я попытаюсь использовать tensorflow 1 для вашего примера (который, я полагаю, вы используете из-за «сеанса»), я получу, что не могу преобразовать символьный тензор в массив.

2. он может это сделать, потому что A — тензор, а не массив numpy

3. np.dot(A,A): <tf.Tensor ‘mul_1:0’ shape=(2, 3) dtype=int32>

Ответ №1:

Для базовой алгебры вы не можете умножить скалярное произведение прямоугольной матрицы (a x b) на (a x b) . Вы можете умножить его только путем переноса. (a x b)x(a x b).T = (a x b)(b x a) = (a x a) . Следовательно, ваш np.dot неверен.

Однако причина, по которой вы все еще можете выполнить, заключается в том, что ваш A является тензором, а не массивом numpy.

A <tf.Tensor 'Const_1:0' shape=(2, 3) dtype=int32>

Поэтому скалярное произведение превратится в mul для тензора

np.dot(A,A) <tf.Tensor 'mul_1:0' shape=(2, 3) dtype=int32>

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

1. Большое спасибо dtlam! Мне просто любопытно, почему np.dot превратится в mul для тензора, поскольку он никогда не упоминается в словаре np.dot. — только упомянутый будет включать mul для 0/1 D массивов, поэтому мне очень любопытно, как это может быть..

2. будьте осторожны с tf и numpy 🙂 удачного пути, Фред

Ответ №2:

np.dot() при работе с 2d-массивом numpy получен тот же результат, np.matmul() что и . Поскольку он такой же, как matmul, он не может умножать прямоугольную матрицу на себя, поэтому используйте transpose в качестве второго аргумента.

Как показано ниже

 G = np.dot(A,tf.transpose(A))
g2 = np.matmul(A,tf.transpose(A))
print(G.shape)
print(G-g2)
>>> [[0 0]
 [0 0]]
  

Вместо этого вы можете использовать

 tf.math.reduce_sum(tf.math.multiply(A, A))
>>> <tf.Tensor: shape=(), dtype=int32, numpy=91>
  

затем вы можете вызвать .numpy() его, чтобы получить 91.

Но если вы хотите умножить поэлементно, используйте

 tf.multiply(A, A)
>>> <tf.Tensor: shape=(2, 3), dtype=int32, numpy=
array([[ 1,  4,  9],
       [16, 25, 36]], dtype=int32)>
  

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

1. спасибо, Рагнар, за ответ! это действительно полезно и очень подробно. 🙂 Да, np.dot не может умножать прямоугольную матрицу, но мне кажется довольно странным, почему np.dot может выполняться, когда внутри помещается тензор — как в примере, который я показал, np.dot неожиданно превратился в элементное умножение. Когда я искал в словаре np.dot, он упоминал только, что будет умножаться по элементам для 0/1 D массивов, но никогда не упоминает тензоры, поэтому я не знаю, ошибка это или что-то, чего я не знаю, поэтому поднял этот вопрос..