【问题标题】:How to learn multi-class multi-output CNN with TensorFlow如何使用 TensorFlow 学习多类多输出 CNN
【发布时间】:2016-10-28 13:00:49
【问题描述】:

我想用 TensorFlow 训练一个卷积神经网络来做多输出多类分类。

例如:如果我们采用 MNIST 样本集并总是将两张随机图像组合成一张,然后想要对结果图像进行分类。分类的结果应该是图中显示的两位数。

所以网络的输出可以具有 [-1, 2, 10] 的形状,其中第一个维度是批次,第二个维度代表输出(是第一个还是第二个数字),第三个是“通常”显示数字的分类。

我现在尝试在谷歌上搜索一段时间,但找不到有用的东西。另外,我不知道多输出多类分类是否是此任务的正确命名。如果不是,正确的命名是什么?您是否有任何链接/教程/文档/论文来解释我需要做什么来构建损失函数/训练操作?

我尝试使用 tf.split 将网络的输出拆分为单个输出,然后在每个输出上使用 softmax_cross_entropy_with_logits。我对所有输出进行平均的结果,但它似乎不起作用。这还算合理吗?

【问题讨论】:

    标签: tensorflow conv-neural-network


    【解决方案1】:

    有关分类问题的命名法,您可以查看此链接: http://scikit-learn.org/stable/modules/multiclass.html

    所以你的问题被称为“多标签分类”。在正常的 TensorFlow 多类分类(经典 MNIST)中,您将有 10 个输出单元,最后您将使用 softmax 来计算损失,即“tf.nn.softmax_cross_entropy_with_logits”。

    例如:如果您的图像有“2”,那么 groundtruth 将为 [0,0,1,0,0,0,0,0,0,0]

    但是在这里,您的网络输出将有 20 个单位,您将使用 sigmoid 即“tf.nn.sigmoid_cross_entropy_with_logits”

    例如:如果您的图像有“2”和“4”,那么 groundtruth 将为 [0,0,1,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0],即前十位表示第一个数字类,第二个表示第二个数字类。

    【讨论】:

      【解决方案2】:

      首先,您必须为包含两个不同图像的图像提供两个标签。然后更改您的目标损失函数,使其最大化两个给定标签的输出并训练您的模型。我认为您不需要拆分输出。

      【讨论】:

      • 好吧,我的问题是损失函数应该是什么样子的。有没有我可以调用的 tensorflow 方法来计算这个损失函数?如果没有,我该如何计算?
      • 对不起,我对 tensorflow 不太熟悉,但是在阅读完本教程后,我假设 y_ 应该只有几个值,例如交叉熵:cross_entropy = tf .reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y, y_)) 你试过吗?如果它不起作用,请自己编码成本函数,标签是矩阵,而不是向量。例如,在 theano 中,负对数似然是: T.mean(T.log(self.p_y_given_x)[T.arange(y.shape[0]), y]) 我会让 y(labels) 成为一个矩阵每个示例的标签。
      猜你喜欢
      • 2021-05-25
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      相关资源
      最近更新 更多