Comment puis-je multiplier un vecteur par une matrice dans tensorflow sans remodelage?
Ce:
import numpy as np
a = np.array([1, 2, 1])
w = np.array([[.5, .6], [.7, .8], [.7, .8]])
print(np.dot(a, w))
# [ 2.6 3. ] # plain nice old matrix multiplication n x (n, m) -> m
import tensorflow as tf
a = tf.constant(a, dtype=tf.float64)
w = tf.constant(w)
with tf.Session() as sess:
print(tf.matmul(a, w).eval())
résultats dans:
C:\_\Python35\python.exe C:/Users/MrD/.PyCharm2017.1/config/scratches/scratch_31.py
[ 2.6 3. ]
# bunch of errors in windows...
Traceback (most recent call last):
File "C:\_\Python35\lib\site-packages\tensorflow\python\framework\common_shapes.py", line 671, in _call_cpp_shape_fn_impl
input_tensors_as_shapes, status)
File "C:\_\Python35\lib\contextlib.py", line 66, in __exit__
next(self.gen)
File "C:\_\Python35\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 466, in raise_exception_on_not_ok_status
pywrap_tensorflow.TF_GetCode(status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Shape must be rank 2 but is rank 1 for 'MatMul' (op: 'MatMul') with input shapes: [3], [3,2].
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:/Users/MrD/.PyCharm2017.1/config/scratches/scratch_31.py", line 14, in <module>
print(tf.matmul(a, w).eval())
File "C:\_\Python35\lib\site-packages\tensorflow\python\ops\math_ops.py", line 1765, in matmul
a, b, transpose_a=transpose_a, transpose_b=transpose_b, name=name)
File "C:\_\Python35\lib\site-packages\tensorflow\python\ops\gen_math_ops.py", line 1454, in _mat_mul
transpose_b=transpose_b, name=name)
File "C:\_\Python35\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 763, in apply_op
op_def=op_def)
File "C:\_\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 2329, in create_op
set_shapes_for_outputs(ret)
File "C:\_\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 1717, in set_shapes_for_outputs
shapes = shape_func(op)
File "C:\_\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 1667, in call_with_requiring
return call_cpp_shape_fn(op, require_shape_fn=True)
File "C:\_\Python35\lib\site-packages\tensorflow\python\framework\common_shapes.py", line 610, in call_cpp_shape_fn
debug_python_shape_fn, require_shape_fn)
File "C:\_\Python35\lib\site-packages\tensorflow\python\framework\common_shapes.py", line 676, in _call_cpp_shape_fn_impl
raise ValueError(err.message)
ValueError: Shape must be rank 2 but is rank 1 for 'MatMul' (op: 'MatMul') with input shapes: [3], [3,2].
Process finished with exit code 1
(pas sûr pourquoi, la même exception est générée à l'intérieur de sa manipulation)
La solution proposée dans Tensorflow exception avec matmul est en train de remodeler le vecteur d'une matrice, mais cela conduit à inutilement compliqué code est-il toujours pas d'autre moyen de multiplier un vecteur par une matrice?
D'ailleurs à l'aide de expand_dims
(comme suggéré dans le lien ci-dessus) avec des arguments par défaut soulève un ValueError
- qui n'est pas mentionné dans la docs et de défaites le but d'avoir un argument par défaut.
Accepté de répondre fonctionne, mais c'est vraiment une API bug signalé: github.com/tensorflow/tensorflow/issues/9055
Merci pour en faire un problème, ce problème m'a dérangé. Pour beaucoup plus agréable de solution à cela, et bien plus de cas d'utilisation-voir ma réponse.
Merci pour en faire un problème, ce problème m'a dérangé. Pour beaucoup plus agréable de solution à cela, et bien plus de cas d'utilisation-voir ma réponse.
OriginalL'auteur Mr_and_Mrs_D | 2017-04-07
Vous devez vous connecter pour publier un commentaire.
Matmul a été codé pour le rang deux ou plus de tenseurs. Pas sûr pourquoi, pour être honnête, comme numpy est tel qu'il permet de matrice vecteur de multiplication.
Ainsi, le "*" opération de multiplication régulièrement numpy radiodiffusion sematics(c'est peut-être manquant un peu de fantaisie à l'indexation des trucs). Dans ce qui précède, il va multiplier un vecteur à travers chaque vecteur dans w. Puis reduce_sum va s'effondrer une dimension en additionnant le long de cette dimension. donc, nous allons partir d'une * w -> reduce_sum(produit) -> sna; ([n * nxm]) -> [nxm] -> [m]. Axe détermine l'axe d'ajouter dans ce cas, nous voulons 0 pour obtenir notre résultat final de dimension m.
Nan je suis désolé ->
print(tf.reduce_sum(a * w, axis=0).eval())
résultats dansValueError: Dimensions must be equal, but are 3 and 2 for 'mul' (op: 'Mul') with input shapes: [3], [3,2].
dans le code en questionDésolé pour le problème de la radiodiffusion. J'ai corrigé le code et a fourni deux exemples qui produisent les mêmes résultats dans numpy et tf.
Merci - je l'ai signalé ici: github.com/tensorflow/tensorflow/issues/9055
OriginalL'auteur Steven
tf.einsum
vous donne la possibilité de faire exactement ce dont vous avez besoin à la fois concise et intuitive forme:Même d'arriver à écrire votre commentaire explicitement
n x (n, m) -> m
. Il est plus lisible et intuitif à mon avis.Mon préféré de cas d'utilisation, c'est quand vous voulez multiplier un lot de matrices avec un poids de vecteur:
De sorte que vous pouvez facilement multiplier le poids sur tous les lots avec pas de transformations ou de duplication. Ce que vous ne pouvez pas le faire en élargissant les dimensions comme dans les autres répondre. Afin de vous éviter la
tf.matmul
obligation de faire correspondre les dimensions par lots et d'autres dimensions extérieures:OriginalL'auteur dsalaj
Vous pouvez utiliser
tf.tensordot
et définiraxes=1
. Pour la simple exploitation d'un vecteur temps d'une matrice, c'est un peu plus propre quetf.einsum
OriginalL'auteur Hooked