2017-10-19 1 views
1

Ich habe eine Funktion, die einige Tensorflow-Funktionen verwendet. Ich brauche diese Funktion in Theano, da ich auf der Plattform diesen Code verwenden möchte, ist nur Theano installiert und nicht Tensorflow. Ich arbeite hauptsächlich mit Keras, also ist Tensorflow ziemlich kryptisch für mich. Die Funktion sieht wie folgt aus:Ist es möglich, Tensorflow-Code in denano-Code umzuwandeln?

class WeightedBinaryCrossEntropy(object): 

    def __init__(self, pos_ratio): 
     neg_ratio = 1. - pos_ratio 
     self.pos_ratio = tf.constant(pos_ratio, tf.float32) 
     self.weights = tf.constant(neg_ratio/pos_ratio, tf.float32) 
     self.__name__ = "weighted_binary_crossentropy({0})".format(pos_ratio) 

    def __call__(self, y_true, y_pred): 
     return self.weighted_binary_crossentropy(y_true, y_pred) 

    def weighted_binary_crossentropy(self, y_true, y_pred): 
     # Transform to logits 
     epsilon = tf.convert_to_tensor(K.common._EPSILON, y_pred.dtype.base_dtype) 
     y_pred = tf.clip_by_value(y_pred, epsilon, 1 - epsilon) 
     y_pred = tf.log(y_pred/(1 - y_pred)) 

     cost = tf.nn.weighted_cross_entropy_with_logits(y_true, y_pred, self.weights) 
     return K.mean(cost * self.pos_ratio, axis=-1) 

model.compile(loss=WeightedBinaryCrossEntropy(0.05), optimizer=optimizer, metrics=['accuracy']) 

Installation Tensorflow auf der Plattform ist nicht möglich. Ich habe den Code von hier https://github.com/fchollet/keras/issues/2115

Also gibt es Funktionen in Theano, die wie die Funktionen in Tensorflow funktionieren?

Antwort

3

Vielleicht sollten Sie nur keras verwenden und ein tragbares Modell haben:
(Keras Funktionen: https://keras.io/backend/)

class WeightedBinaryCrossEntropy(object): 

    def __init__(self, pos_ratio): 
     neg_ratio = 1. - pos_ratio 
     self.pos_ratio = K.constant([pos_ratio]) 
     self.weights = K.constant([neg_ratio/pos_ratio]) 
     self.__name__ = "weighted_binary_crossentropy({0})".format(pos_ratio) 

    def __call__(self, y_true, y_pred): 
     return self.weighted_binary_crossentropy(y_true, y_pred) 

    def weighted_binary_crossentropy(self, y_true, y_pred): 
     # Transform to logits 
     epsilon = K.epsilon() 
     y_pred = K.clip(y_pred, epsilon, 1 - epsilon) 
     y_pred = K.log(y_pred/(1 - y_pred)) 

     #for the crossentropy, you can maybe (make sure, please) 
     #use K.binary_crossentropy and multiply the weights later 
     cost = self.approach1(y_true,y_pred) 

     #or you could simulate the same formula as in tensorflow: 
     #https://www.tensorflow.org/api_docs/python/tf/nn/weighted_cross_entropy_with_logits 
     cost = self.approach2(y_true,y_pred) 

     return K.mean(cost * self.pos_ratio, axis=-1) 

    #I use a similar thing in my codes, but I'm not sure my weights are calculated the same way you do 
    def approach1(self,y_true,y_pred): 

     weights = (y_true * self.weights) + 1 #weights applied only to positive values 
     return K.binary_crossentropy(y_true, y_pred,from_logits=True)*weights 

    #seems more trustable, since it's exactly the tensorflow formula 
    def approach2(self,y_true,y_pred): 

     posPart = y_true * (-K.log(K.sigmoid(y_pred))) * self.weights 
     negPart = (1-y_true)*(-K.log(1 - K.sigmoid(y_pred))) 

     return posPart + negPart    


model.compile(loss=WeightedBinaryCrossEntropy(0.05), optimizer=optimizer, metrics=['accuracy']) 
+0

Vielen Dank, wird es einige Zeit dauern, um es zu testen: Nach dem Test werde ich es wohl akzeptieren . –

Verwandte Themen