TensorFlow:非单热矢量的最佳方法?

时间:2016-01-20 10:35:22

标签: machine-learning statistics neural-network tensorflow conv-neural-network

目前,我有一个CNN预测课程用这样的单y_train个向量:

[ 0., 0., 0., 0., 0., 1.0, 0., 0., 0., 0., 0. ]

所以np.argmax(y_train)将返回5,因为这是正确的类。

不幸的是,我对网络的培训数据要少得多,以便正确地对我的测试数据进行分类。随着时间的推移训练错误变得更好,但我认为这是过度拟合。测试错误总是很糟糕。

我认为正常的分发会让网络的生活变得更轻松,所以我不想说第5类是唯一正确的类而且所有其他类都是同样错误的,如果它预测,我想给网络一个很高的惩罚0级而不是5级但如果它预测4而不是5则只是一个小的惩罚。我认为y_train对于编码类5的向量看起来像这样:

# values are rounded for displaying them in one line, original vector
# is always full tf.float32
[ 0., 0.,0.004, 0.054, 0.242, 0.399, 0.242, 0.054, 0.004, 0., 0., ]

问题是,哪种计算成本的方法是合适的?

将:

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y_net, y_train)

train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

即使y_train向量不再是单热编码,仍会产生合理的结果吗?

或者这需要更强的架构更改吗?目前我有两个Conv / Pool-Layers和两个完全连接的。输出只是y_net = tf.matmul(h_fc1_drop, W_fc2) + b_fc2,因为tf.nn.softmax_cross_entropy_with_logits应用了softmax。

我的实际架构具有800维输出向量的输出,因此现在几乎没有训练数据,网络几乎从未设法在测试数据中正确地击中800个单个类,仅在训练数据中(具有过度拟合) )。

但是,如果网络在类似+/- 20的范围内预测类,我会完全没问题。因此,如果400级是正确的,那么预测380到420之间的类就足够了。

2 个答案:

答案 0 :(得分:1)

根据文档,softmax_cross_entropy_with_logits应该支持您的用例。

由于您可以在+/- 20的范围内预测并且不一定是精确的标签,因此可能更好的损失是合适的。例如,目标(例如400)与您的预测(例如420)之间的MSE?这部分听起来更像是与TensorFlow相关的研究问题。

答案 1 :(得分:0)

  

但是,如果网络在类似+/- 20的范围内预测类,我会完全没问题。因此,如果400级是正确的,那么预测380到420之间的类就足够了。

我认为这里显而易见的事情是让你的标签更粗糙,即如果你预测深度值,你可以有100个不同的值而不是800.