#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 массивов, но никогда не упоминает тензоры, поэтому я не знаю, ошибка это или что-то, чего я не знаю, поэтому поднял этот вопрос..