La différence entre la np.dot et np.multipliez par np.somme binaire d'entropie croisée calcul de la perte de
J'ai essayé le code suivant, mais n'ai pas trouvé la différence entre np.dot et np.multipliez par np.somme
Ici est np.dot code
logprobs = np.dot(Y, (np.log(A2)).T) + np.dot((1.0-Y),(np.log(1 - A2)).T)
print(logprobs.shape)
print(logprobs)
cost = (-1/m) * logprobs
print(cost.shape)
print(type(cost))
print(cost)
Sa sortie est
(1, 1)
[[-2.07917628]]
(1, 1)
<class 'numpy.ndarray'>
[[ 0.693058761039 ]]
Voici le code pour np.multipliez par np.somme
logprobs = np.sum(np.multiply(np.log(A2), Y) + np.multiply((1 - Y), np.log(1 - A2)))
print(logprobs.shape)
print(logprobs)
cost = - logprobs / m
print(cost.shape)
print(type(cost))
print(cost)
Sa sortie est
()
-2.07917628312
()
<class 'numpy.float64'>
0.693058761039
Je suis incapable de comprendre le type et la forme de la différence alors que la valeur du résultat est le même dans les deux cas
Même dans le cas de compression de l'ancien code valeur de coût devient que plus tard, mais le type reste la même
cost = np.squeeze(cost)
print(type(cost))
print(cost)
de sortie est
<class 'numpy.ndarray'>
0.6930587610394646
np.sum
retourne un scalaire, np.dot
n'est pas...Pour obtenir une réponse concrète, vous devriez probablement vous offrir les formes de la saisie des tableaux. En général, ce que vous voyez, c'est que
np.sum
toujours par défaut sommes sur l'ensemble de l'entrée et retourne un scalaire. np.dot
seulement sommes sur un axe (ce qui, dans votre cas semble être le seul), et conserve les dimensions.Ce que vous faites est le calcul de la
binary cross-entropy loss
et les deux approches que vous avez essayé de l'équivalent, qui est pourquoi vous obtenez le même résultat. Il n'est pas clair ce que votre question réelle est d'environ.En fait, je cherchais une valeur scalaire en réponse de np.dot
Pour obtenir une valeur scalaire, vous devez utiliser des tableaux 1d, pas de la 2d.
OriginalL'auteur Asad Shakeel | 2018-01-11
Vous devez vous connecter pour publier un commentaire.
Ce que vous faites est le calcul de la binaire entropie croisée mesures de mauvaises prédictions (ici:
A2
) du modèle sont comparés à la vraie sorties (ici:Y
).Voici un exemple reproductible pour votre cas, ce qui doit expliquer pourquoi vous obtenez un scalaire dans le second cas, à l'aide de
np.sum
Noter que le
np.dot
sommes le long de seulement les dimensions intérieures qui correspondent ici(1x8) and (8x1)
. Ainsi, la8
s auront disparu lors de la dot de produit ou de multiplication de matrice ce qui donne le résultat que(1x1)
qui est juste un scalaire mais retourné comme tableau 2D de forme(1,1)
.Aussi, et surtout notez qu'ici,
np.dot
est exactement commenp.matmul
depuis les entrées sont des tableaux 2D (c'est à dire les matrices)Résultat de retour en tant que scalaire valeur
np.dot
ounp.matmul
retourne quel que soit le tableau qui en résulte forme serait, basée sur la saisie des tableaux. Même avecout=
argument, il n'est pas possible de retourner un scalaire, si les entrées sont en 2D tableaux. Cependant, nous pouvons utilisernp.asscalar()
sur le résultat pour le convertir en un scalaire si le résultat de la matrice est de la forme(1,1)
(ou plus généralement d'une scalaire valeur enveloppé dans un nD tableau)np.dot()
dans ce cas? Parce que c'est en donnant la même réponse quenp.multiply()
avecnp.sum()
.ajout d'un hack pour convertir le résultat scalaire 🙂
Merci!!!! J'avais upvote vous plus d'une fois si je pouvais 🙂
Belle explication. Sauvé beaucoup de temps.
OriginalL'auteur kmario23
np.dot
est le produit scalaire de deux matrices.Alors que
np.multiply
un élément-sage de multiplication de deux matrices.Lorsqu'il est utilisé avec
np.sum
, le résultat étant égales agit simplement d'une coïncidence.*
de multiplier deux matrices?À l'aide de la
*
de multiplier les matrices aussi ne de l'élément de sage multiplicaiton, comme le ⊙ etnp.multiply
de l'opérateur.Un excellent (car concis) réponse.
hé, pouvez-vous expliquer ce qu'est np.matmul() ne
Il effectue une multiplication de matrice. Veuillez voir ma réponse ci-dessus pour plus d'explication!
OriginalL'auteur Anuj Gautam
Si
Y
etA2
sont (1,N) ensembles, puisnp.dot(Y,A.T)
va produire une (1,1) résultat. Il est en train de faire une multiplication de matrice de a (1,N) avec a (N,1). LeN's
sont additionnés, laissant l' (1,1).Avec
multiply
le résultat est (1,N). La somme de toutes les valeurs, et le résultat est un scalaire.Si
Y
etA2
étaient (N,) en forme (même nombre d'éléments, mais 1d), lanp.dot(Y,A2)
(pas de.T
) serait également produire un scalaire. Denp.dot
documentation:squeeze
réduit tous les taille 1 dimensions, mais encore retourne un tableau. Dansnumpy
un tableau peut avoir un nombre quelconque de dimensions (de 0 à 32). Ainsi, une 0d tableau est possible. Comparer la forme denp.array(3)
,np.array([3])
etnp.array([[3]])
.OriginalL'auteur hpaulj
OriginalL'auteur Ashish S