python - 训练模型后无法提取单个预测
问题描述
我有一个模型可以在测试数据集上报告大约 0.67 的准确度。但是,我想提取每个样本的单个预测,看看它在每个样本上的表现如何。我读到我应该在会话中运行 logits 层,并会得到每个样本的预测数组。这似乎不起作用,因为它只会对验证集中的每个样本的第一个类别进行预测。
# predictions
logits = tf.layers.dense(flat_d, NUM_CLASSES, activation=tf.nn.relu)
# Cost function and optimizer
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=labels))
# cost = -tf.reduce_sum(labels*tf.log(logits + 1e-10))
train_step = tf.train.AdamOptimizer(learning_rate_).minimize(cost)
# Accuracy
correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(labels, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32), name='accuracy')
....
print("Initializing the model")
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for e in np.arange(num_epochs):
bx,by = load_batch(trainX,trainY,batch_size_)
sess.run(train_step,feed_dict={inputs:bx,labels:by,keep_prob:0.9,learning_rate_:learn_rate})
acc = sess.run(accuracy,feed_dict={inputs:testX,labels:testY,keep_prob:1.0,learning_rate_:learn_rate})
print("----------\nAccuracy:%.3f"%(acc))
# Extract individual precitions by class
print(sess.run(logits,feed_dict={inputs:testX,labels:testY,keep_prob:1.0}))
这是输出的摘要:
Number of validation samples: 203
By category:
0: 34
1: 138
2: 31
print(sess.run(accuracy,feed_dict={inputs:testX,labels:testY,keep_prob:1.0,learning_rate_:learn_rate}))
Accuracy:0.680
print(sess.run(logits,feed_dict={inputs:testX,labels:testY,keep_prob:1.0}))
[[1.6453042 0. 0. ]
[1.454038 0. 0. ]
[1.6372575 0. 0. ]
[1.5505953 0. 0. ]
[1.6624011 0. 0. ]
[1.6376897 0. 0. ]
[1.5477558 0. 0. ]
[1.5303426 0. 0. ]
[1.3636262 0. 0. ]
[1.5397886 0. 0. ]
[1.8849531 0. 0. ]
.....
etc.
关于我做错了什么的任何指示,或者我如何提取每个样本的预测而不仅仅是整体准确性?
谢谢
解决方案
该命令print(sess.run(logits,feed_dict={inputs:testX,labels:testY,keep_prob:1.0}))
打印Probabilities
每个Class
.
在您的代码中,您正在使用NUM_CLASSES
并且softmax_cross_entropy_with_logits
这表明您的机器学习问题Classification
与 3 有关Classes
。
截至目前,您的预测不正确(
[[1.6453042 0. 0. ]
[1.454038 0. 0. ]
) 因为您使用的是Activation
Function, ' Relu
' for Classification
.
您需要在代码中进行的一项更正Predictions
是将“ relu
”替换为“”,softmax
即替换
logits = tf.layers.dense(flat_d, NUM_CLASSES, activation=tf.nn.relu)
和
logits = tf.layers.dense(flat_d, NUM_CLASSES, activation=tf.nn.softmax)
然后print(sess.run(logits,feed_dict={inputs:testX,labels:testY,keep_prob:1.0}))
会输出一些类似的东西,
[9.87792790e-01, 1.05240829e-02, 4.70216728e-05],
[8.80016625e-01, 1.13000005e-01, 5.14236337e-04]
每个值代表Probability
对应于各自的Class
.
如果您遇到任何其他错误,请告诉我,我很乐意为您提供帮助。
希望这可以帮助。快乐学习!
推荐阅读
- javascript - 为什么 useEffect 挂钩在 DOM 加载之前运行?
- listview - Flutter - 在Android上将项目添加到列表后ListView没有更新
- kubernetes - 输入字节 8 处的非法 base64 数据
- python - 使用反斜杠 Jsonify 响应数据
- c# - Blazor 从 Child 获取 Parent ModelType 进行反射
- z3 - 使用 Z3 检查一阶公式的可满足性
- python - 使用 Pyomo 的初始条件错误
- python - 使用 numpy 求解线性系统
- c# - 错误 401 未经授权即使通过身份验证也无法访问我的主页
- java - JMeter 是否适用于 OpenJDK 13?