python - 在 CNN 分类上使用 tensorflow 绘制混淆矩阵
问题描述
我正在尝试绘制一个混淆矩阵来分析我的训练和测试,但我在打印/绘制矩阵时遇到了困难。我正在使用带有 Tensorflow 的卷积神经网络进行分类,并且我有 3 个标签要分类。
这就是我试图打印它的方式:
true_class = tf.argmax(y, 1)
predicted_class = tf.argmax(prediction, 1)
confusion = tf.confusion_matrix(true_class, predicted_class, 3)
print(confusion)
但打印返回我以下结果:
Tensor("confusion_matrix/SparseTensorDenseAdd:0", shape=(3, 3), dtype=int32)
然后我搜索了有同样问题的人,我试着这样做:
true_class = tf.argmax(y, 1)
predicted_class = tf.argmax(prediction, 1)
confusion = tf.confusion_matrix(true_class, predicted_class, 3)
print('Confusion Matrix: \n\n', tf.Tensor.eval(confusion,feed_dict=None, session=sess))
它给了我以下错误:
tensorflow.python.framework.errors_impl.InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder' with dtype float
[[{{node Placeholder}}]]
我的代码:
def convolutional_neural_network(x):
number = calc()
weights = {'W_conv1': tf.Variable(tf.random_normal([3, 3, 3, 1, 32])),
'W_conv2': tf.Variable(tf.random_normal([3, 3, 3, 32, 64])),
'W_fc': tf.Variable(tf.random_normal([number, 1024])),
'out': tf.Variable(tf.random_normal([1024, n_classes]))}
biases = {'b_conv1': tf.Variable(tf.random_normal([32])),
'b_conv2': tf.Variable(tf.random_normal([64])),
'b_fc': tf.Variable(tf.random_normal([1024])),
'out': tf.Variable(tf.random_normal([n_classes]))}
x = tf.reshape(x, shape=[-1, IMG_SIZE_PX, IMG_SIZE_PX, SLICE_COUNT, 1])
conv1 = tf.nn.relu(conv3d(x, weights['W_conv1']) + biases['b_conv1'])
conv1 = maxpool3d(conv1)
conv2 = tf.nn.relu(conv3d(conv1, weights['W_conv2']) + biases['b_conv2'])
conv2 = maxpool3d(conv2)
fc = tf.reshape(conv2, [-1, number])
fc = tf.nn.relu(tf.matmul(fc, weights['W_fc']) + biases['b_fc'])
fc = tf.nn.dropout(fc, keep_rate)
output = tf.matmul(fc, weights['out']) + biases['out']
return output
def train_neural_network(x):
much_data = np.load('muchdata-50-50-30-pre.npy', allow_pickle=True)
train_data = much_data[400:410]
validation_data = much_data[390:399]
prediction = convolutional_neural_network(x)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(
logits=prediction, labels=y))
optimizer = tf.train.AdamOptimizer().minimize(cost)
hm_epochs = 1
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(hm_epochs):
epoch_loss = 0
for data in train_data:
X = data[0]
Y = data[1]
_, c = sess.run([optimizer, cost], feed_dict={x: X, y: Y})
epoch_loss += c
print('Epoch', epoch + 1, '/', hm_epochs, '. Loss:', epoch_loss)
true_class = tf.argmax(y, 1)
predicted_class = tf.argmax(prediction, 1)
confusion = tf.confusion_matrix(true_class, predicted_class, 3)
print('Confusion Matrix: \n\n', tf.Tensor.eval(confusion,feed_dict=None, session=sess))
correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct, 'float'))
saver = tf.train.Saver()
saver.save(sess, '../api/modelo')
print('Accuracy:', accuracy.eval(
{x: [i[0] for i in validation_data], y: [i[1] for i in validation_data]}))
如果有人能帮我弄清楚发生了什么,我将不胜感激!我是这个话题的新手,我真的很挣扎。
非常感谢!
解决方案
您需要将值提供给feed_dict
. 您可以尝试替换以下代码行吗?
print('Confusion Matrix: \n\n', tf.Tensor.eval(confusion,feed_dict=None, session=sess))
使用以下内容,您的测试输入和标签在哪里your_X
,your_Y
我们需要在其上绘制混淆矩阵。
print(sess.run(confusion, feed_dict={x:your_X, y:your_Y}))
推荐阅读
- sql - 如果旧值在 Merge 中更新时未更改,则不要在 Merge 语句中更新值
- python - 如何创建嵌套字典 PYTHON
- c++ - 实现模板化成员函数时的“非类型偏特化”
- php - 将分配的经理姓名缩写按顺序添加到 WooCommerce 订单号
- python - 无法打印出 For 循环
- rust - 如何使用依赖的依赖类型?
- c++ - 为什么在 C++ 模板中,声明一个向量
静态成员变量会产生链接器错误,但内联静态不会? - json - 使用 JQ 从 JSON 转换后 CSV 文件中的列名
- sql - 在单个查询中获取行数和不同行数的最佳方法
- javascript - 失败:urls.map 不是函数