Спасибо за вашу помощь.Я кодирую мультиклассовый двоичный классификатор для лицевых действий (таких как поднятая бровь, раздвинутые губы), и я хочу создать путаницу.Есть 6 лицевых действий и 593 образца.Я получаю эту ошибку: я получаю эту ошибку: «Форма (?, 2, 6) должна иметь ранг 2».Из документации tf.confusion_matrix принимает одномерные векторы, но я думаю, что должен быть способ сформировать входные данные из feed_dict так, чтобы он работал на основе Tensorflow Confusion Matrix в TensorBoard .Метки и прогнозы выглядят следующим образом:
# Rows are samples, columns are classes, and the classes shows a facial
# action which is either 1 for detection or 0 for no detection.
[[0, 0, 1, 0, 1, 0],
[1, 0, 0, 0, 1, 0],
[0, 1, 0, 0, 1, 1],...]
Я использую MLP с прямой связью, а переменная pred - это прогноз, с порогом, заставляющим сделать выбор 0 или 1. Я попытался умножить прогнозыи метки np.arange (1,7), чтобы положительные значения соответствовали индексам, но я застрял в форме аргументов.
Там больше кода, но я показываю то, что я считаю уместным.
sess = tf.Session()
x = tf.placeholder(tf.float32, [None, n_input], name = "x")
y = tf.placeholder(tf.float32, [None, n_output], name = "labels")
#2 fully connected layers
fc1 = fc_layer(x, n_input, n_hidden_1, "fc1")
relu = tf.nn.relu(fc1)
tf.summary.histogram("fc1/relu", relu)
logits = fc_layer(relu, n_hidden_1, n_output, "fc2")
# Calculate loss function
with tf.name_scope("xent"):
xent = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(
logits=logits, labels=y, name="xent"))
with tf.name_scope("train"):
train_step = tf.train.AdamOptimizer(learning_rate).minimize(xent)
# Choose between 0 and 1
onesMat = tf.ones_like(logits)
zerosMat = tf.zeros_like(logits)
pred = tf.cast(tf.where(logits>=zero,onesMat,zerosMat),dtype=tf.float32, name = "op_to_restore")
# Problem occurs when I add this line.
confusion = tf.confusion_matrix(predictions = pred*np.arange(1,7), labels = y*np.arange(1,7), num_classes = n_output, name = "confusion")
# Save and visualize results
saver = tf.train.Saver()
init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
sess.run(init)
writer = tf.summary.FileWriter(LOGDIR + hparam + '/train')
writer.add_graph(sess.graph)
# Train
for i in range(2001):
if i % 5 == 0:
[train_accuracy, s] = sess.run([accuracy, summ], feed_dict={x: train_x, y: train_y})
writer.add_summary(s, i)
if i % 50 == 0:
[acc,s] = sess.run([accuracy, summ],feed_dict={x: test_x, y: test_y})
sess.run(train_step, feed_dict={x: train_x, y: train_y})
Спасибо!