【问题标题】:Printing outcome probabilities from a trained Keras Model从训练有素的 Keras 模型打印结果概率
【发布时间】:2021-08-04 13:04:18
【问题描述】:

当我提供 原始数据时,我正尝试从我训练的模型中打印每个类别结果的预测概率。这是一个多类分类问题,有 8 个输出和 21 个输入。

当我展示新数据时,我可以打印 1 个结果,例如:

 "Example 0 prediction: 1 (15.0%)"

相反,我希望看到类似于下面的内容。其中显示了每个类(0、1、2、3、4、6、Wide、Out)的概率:

Example 0 prediction 0: (12.5%), prediction 1: (12.5%), prediction 2: (12.5%), prediction 3: (12.5%), prediction 4: (12.5%), prediction 6: (12.5%), prediction Wide: (12.5%), prediction Out: (12.5%)

请注意,我已尝试搜索类似问题,包括 hereherehere,并查阅了 TensorFlow 文档。但是,这些主要讨论模型本身的更改,例如在最后一层激活softmax,将分类交叉熵作为损失函数等,从而生成概率。

我已经包含了模型架构以及预测代码以实现完全可见性。

型号:

earlystopping = callbacks.EarlyStopping(monitor ="val_loss", 
                                        mode ="min", patience = 125, 
                                        restore_best_weights = True)
  
#define Keras
model = Sequential()
model.add(Dense(50, input_dim=21))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.5,input_shape=(50,)))
model.add(Dense(50))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.5,input_shape=(50,)))
model.add(Dense(8, activation='softmax'))

#compile the keras model
model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])   

model.fit(X, dummy_y, validation_split=0.25, epochs=1000, batch_size=100, verbose=1, callbacks=[earlystopping])

_, accuracy3 = model.evaluate(X, dummy_y, verbose=0)
print('Accuracy: %.2f' % (accuracy3*100))

做出预测:

class_names = ['0', '1', '2','3','4','6','Wide','Out']

predict_dataset = tf.convert_to_tensor([
  [1,5,1,0.459,0.322,0.041,0.002,0.103,0.032,0.041,14,0.404,0.284,0.052,0.008,0.128,0.044,0.037,0.043,54,0,],
    [1,18,5,0.512,0.286,0,0,0.083,0.024,0.095,13,0.24,0.44,0.08,0,0.08,0.08,0,0.08,173,3],
    [2,11,13,0.5,0.417,0,0,0.083,0,0.083,82,0.35,0.36,0.042,0.003,0.135,0.039,0.051,0.02,51,7]
])  

predictions = model(predict_dataset, training=False)

for i, logits in enumerate(predictions):
    class_idx = tf.argmax(logits).numpy()
    p = tf.nn.softmax(logits)[class_idx]
    name = class_names[class_idx]
    print("Example {} prediction: {} ({:4.1f}%)".format(i, name,100*p))

输出:

Example 0 prediction: 1 (15.0%)
Example 1 prediction: 1 (16.0%)
Example 2 prediction: 0 (16.9%)

我已经尝试对使用 TensorFlow 的 logits 的 for 循环进行更改,但我仍然无法让它打印每个结果和相关的概率。

非常感谢任何指导。

【问题讨论】:

    标签: tensorflow machine-learning keras


    【解决方案1】:

    最后,我没有尝试实现 For 循环,而是直接打印了 numpy 数组中的每个结果。

    不是最干净的方式,但它可以完成工作。希望将来对某人有用。

    predict_dataset = tf.convert_to_tensor([
        [1,5,1,0.459,0.322,0.041,0.002,0.103,0.032,0.041,14,0.404,0.284,0.052,0.008,0.128,0.044,0.037,0.043,54,0,155]
    ])
    
    predictions = model3(predict_dataset, training=False)
           
    predictions2 = predictions.numpy()
    
    prob_0 = predictions2[0,0]
    prob_1 = predictions2[0,1]
    prob_2 = predictions2[0,2]
    prob_3 = predictions2[0,3]
    prob_4 = predictions2[0,4]
    prob_wide = predictions2[0,5]
    prob_6 = predictions2[0,6]
    prob_wicket = predictions2[0,7]
    
    print(prob_0)
    print(prob_1)
    print(prob_2)
    print(prob_3)
    print(prob_4)
    print(prob_wide)
    print(prob_6)
    print(prob_wicket)
    

    输出

    0.28349978
    0.32451397
    0.06382967
    0.0053077294
    0.20397986
    0.07999096
    6.386134e-08
    0.038877998
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 2021-07-16
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多