J'essaie de définir une perte de triplet en utilisant un descripteur à partir de la sortie d'un CNN, mais cette erreur est apparue lorsque j'essaie de former le réseau.
Ma définition de la fonction de perte:
def compute_loss(descriptor, margin):
diff_pos = descriptor[0:1800:3] - descriptor[1:1800:3]
diff_neg = descriptor[0:1800:3] - descriptor[2:1800:3]
Ltriplet = np.maximum(0, 1 - tf.square(diff_neg)/(tf.square(diff_pos) + margin))
Lpair = tf.square(diff_pos)
Loss = Ltriplet + Lpair
return Loss
ici le descripteur est le résultat de CNN, le revenu de CNN est un ensemble de triplets contenant l'ancre, l'extracteur et le poussoir exactement dans cet ordre. En entrée, j'ai emballé 600 triplets ensemble et les ai introduits dans le CNN.
Ensuite, j'ai eu cette erreur lors de la formation du réseau:
2018-03-08 16:40:49.529263: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
Traceback (most recent call last):
File "/Users/gaoyingqiang/Documents/GitHub/Master-TUM/TDCV/exercise_3/ex3/task2_new.py", line 78, in <module>
loss = compute_loss(h_fc2, margin)
File "/Users/gaoyingqiang/Documents/GitHub/Master-TUM/TDCV/exercise_3/ex3/task2_new.py", line 37, in compute_loss
Ltriplet = np.maximum(0, 1 - tf.square(diff_neg)/(tf.square(diff_pos) + margin))
File "/Users/gaoyingqiang/.virtualenvs/ex3/lib/python3.6/site-packages/tensorflow/python/framework/ops.py", line 614, in __bool__
raise TypeError("Using a `tf.Tensor` as a Python `bool` is not allowed. "
TypeError: Using a `tf.Tensor` as a Python `bool` is not allowed. Use `if t is not None:` instead of `if t:` to test if a tensor is defined, and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on the value of a tensor.
Process finished with exit code 1
Où va mal?
Vous mélangez des opérations numpy et tensorflow. Tensorflow accepte les tableaux numpy normalement (leur valeur est connue statiquement, donc peut être convertie en constante), mais pas l'inverse (la valeur du tenseur n'est connue que lorsque la session est exécutée, sauf évaluation désirée ).
La solution: changer np.maximum
à tf.maximum
.