如何用TensorFlow学习多级多输出CNN

时间:2016-10-28 13:00:49

标签: tensorflow conv-neural-network

我想用TensorFlow训练卷积神经网络进行多输出多类分类。

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

因此,网络的输出可以具有形状[-1,2,10],其中第一个维度是批处理,第二个维度表示输出(是第一个还是第二个数字),第三个是& #34;通常"所示数字的分类。

我现在试着用谷歌搜索一段时间,但是找不到有用的东西。另外,我不知道多输出多类分类是否是此任务的正确命名。如果没有,那么正确的命名是什么?您是否有任何链接/教程/文件/文件说明我需要做什么来建立损失功能/培训操作?

我尝试的是使用tf.split将网络输出分成单个输出,然后在每个输出上使用softmax_cross_entropy_with_logits。结果我对所有输出进行了平均,但它似乎不起作用。这甚至是一种合理的方式吗?

2 个答案:

答案 0 :(得分:3)

对于分类问题的命名,您可以查看以下链接: http://scikit-learn.org/stable/modules/multiclass.html

所以你的问题被称为" Multilabel Classification"。在普通的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],即前10位代表第一位数字,第二位代表第二位数字。

答案 1 :(得分:0)

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