代码之家  ›  专栏  ›  技术社区  ›  mad

如何从一个定制的神经网络模型中获得逻辑和概率

  •  0
  • mad  · 技术社区  · 2 年前

    下面的源代码可以从Tensorflow中的imagenet预训练模型中获得概率和逻辑

    import tensorflow as tf
    import tensorflow.contrib.slim as slim
    import tensorflow.contrib.slim.nets as nets
    import PIL
    import numpy as np
    
    import warnings
    warnings.filterwarnings('ignore')
    
    #Sets the threshold for what messages will be logged
    tf.logging.set_verbosity(tf.logging.ERROR)
    #Starts the Interactive Session
    sess=tf.InteractiveSession()
    
    #Get logits and probs from the model
    def inception(image, reuse):
        preprocessed = tf.multiply(tf.subtract(tf.expand_dims(image, 0), 0.5), 2.0)
        arg_scope = nets.inception.inception_v3_arg_scope(weight_decay=0.0)
        with slim.arg_scope(arg_scope):
            logits, _ = nets.inception.inception_v3(preprocessed, 1001, is_training=False, reuse=reuse)
            logits = logits[:,1:]
            probs = tf.nn.softmax(logits)
        return logits, probs
    
    #Returns logits and probabilities from the network 
    logits, probs = inception(image, reuse=False)
    

    现在,假设我有以下模型:在另一个数据集中微调的RESNET-50,我只需加载其模型定义和权重:

    json_file = open('/path/resnet-model.json', 'r')
    loaded_model_json = json_file.read()
    json_file.close()
    
    model = model_from_json(loaded_model_json)
    #load weights into new model
    model.load_weights("/path/weights/resnet-weights.h5")
    

    如何制作一个类似的函数,从现有的预训练模型中获取问题和逻辑信息?

    P.s1:可以找到模型、权重和示例图像输入 HERE

    P.s2:针对以下问题的一些现有解决方案: HERE 只解释如何得到一个或另一个。我需要一个类似于上面第一个函数的函数,它将为我提供从文件加载的现有训练模型的logits和probs。

    1 回复  |  直到 2 年前
        1
  •  1
  •   AloneTogether    2 年前

    IIUC,你应该可以用同样的方法直接做到这一点:

    import tensorflow as tf
    
    json_file = open('/content/resnet-model.json', 'r')
    loaded_model_json = json_file.read()
    json_file.close()
    
    loaded_model_json = loaded_model_json.replace('"activation":"softmax"', '"activation":"linear"')
    model = tf.keras.models.model_from_json(loaded_model_json)
    
    image = tf.keras.preprocessing.image.load_img('/content/sample-image.jpeg')
    image = tf.constant([tf.keras.preprocessing.image.img_to_array(image)])
    logits = model(image)
    probs = tf.nn.softmax(logits)
    

    您还可以使用 reverse 一个 softmax 功能:

    def inv_softmax(x, C):
       return tf.math.log(x) + C
    
    outputs = tf.keras.layers.Lambda(lambda x : inv_softmax(x, tf.math.log(10.)),name='inv_softmax')(model.output)
    new_model = tf.keras.Model(model.input, outputs) 
    logits = new_model(image)
    probs = tf.nn.softmax(logits)
    

    或者干脆放下最后一层,用 linear 激活功能。