我想使用TensorFlow开发一个多标签分类器,我这里指的是存在多个标签,每个标签包含多个类别。为了说明,你可以想象这样的情况:
- 标签1的类别:有雷雨、下雨、部分下雨、无雨
- 标签2的类别:晴天、部分多云、多云、非常多云
我想使用神经网络对这两个标签进行分类。目前,我对每一个(标签1,标签2)的类别对使用了不同的类别标签。这意味着我有4 x 4 = 16个不同的标签。
通过训练我的模型,
当前损失
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction), reduction_indices=[1])) # prediction is sofmaxedloss = cross_entropy + regul * schema['regul_ratio'] # regul things is for regularization train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
然而,我认为在这种情况下,多标签训练会更有效。
- 我的特征将是[n_samples, n_features]
- 我的标签将是[n_samples, n_classes, 2]
n_samples的[x1, x2, x3, x4 …] # 特征
n_samples的[[0, 0, 0, 1], [0, 0, 1, 0]] # 无雨和多云
如何使用TensorFlow创建一个Softmax概率分布预测器?有没有像这样的多标签问题的实际例子?我的损失张量会是什么样的?
回答:
为什么不让你的网络生成两个不同的输出呢?
网络 -> 预测1和预测2
其中预测1和预测2都是[#,#,#,#],但我下面描述的方法即使它们大小不同也适用。
然后只需运行
loss1 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(prediction1, labels_1))loss2 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(prediction2, labels_2))loss = loss1 + loss2