目前,我有一个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之间的类就足够了。
答案 0 :(得分:1)
根据文档,softmax_cross_entropy_with_logits
应该支持您的用例。
由于您可以在+/- 20的范围内预测并且不一定是精确的标签,因此可能更好的损失是合适的。例如,目标值(例如400)与您的预测(例如420)之间的MSE?这部分听起来更像是与TensorFlow相关的研究问题。
答案 1 :(得分:0)
但是,如果网络在类似+/- 20的范围内预测类,我会完全没问题。因此,如果400级是正确的,那么预测380到420之间的类就足够了。
我认为这里显而易见的事情是让你的标签更粗糙,即如果你预测深度值,你可以有100个不同的值而不是800.