python - 如何从自定义神经网络模型中获取对数和概率

标签 python tensorflow keras deep-learning conv-neural-network

以下源代码可以从 Tensorflow 中的 imagenet 预训练模型中获取概率和 logits

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。

最佳答案

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)

或者只是删除最后一层并定义一个具有线性激活函数的新层。

关于python - 如何从自定义神经网络模型中获取对数和概率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71557494/

相关文章:

python - 使用 Keras 时,验证集中未见的类别会出现错误

python - 如何在 Python 中打印后在两个变量之间添加空格

python - 迭代有效地计算平均值

keras - 使用 Keras 跟踪多个损失

filter - tensorflow 中的 CNN2D 和 CNN2D 在使用方面的区别

machine-learning - 将复值图像输入神经网络( tensorflow )

python - 使用 Keras LSTM 进行多对多分类

python - 临时对象的内存消耗和生命周期

python - Heroku Django 应用程序部署在尝试安装 python 要求后失败

python - 有状态 RNN 在 Keras 功能模型中张量形状错误