Tensorflow 我可以在分类问题中使用MSE作为损失函数和标签编码吗?

Tensorflow 我可以在分类问题中使用MSE作为损失函数和标签编码吗?,tensorflow,keras,deep-learning,mnist,Tensorflow,Keras,Deep Learning,Mnist,在训练过程中似乎没有问题,但我不确定MSE是如何计算的。在这种情况下,keras(或tensorflow)在计算MSE时是否会自动将标签编码转换为一种热编码?您已经通过以下方式手动将标签转换为一种热编码: train\u labels=to\u categorical(train\u labels) 由于softmax层包含10个节点,我假设您打算对10个标签进行分类,这意味着train\u标签将类似于: Epoch 1/5 60000/60000 [======================

在训练过程中似乎没有问题,但我不确定MSE是如何计算的。在这种情况下,keras(或tensorflow)在计算MSE时是否会自动将标签编码转换为一种热编码?

您已经通过以下方式手动将标签转换为一种热编码:

train\u labels=to\u categorical(train\u labels)

由于softmax层包含10个节点,我假设您打算对10个标签进行分类,这意味着
train\u标签
将类似于:

Epoch 1/5
60000/60000 [==============================] - 2s 41us/step - loss: 0.2600 - acc: 0.9244
Epoch 2/5
60000/60000 [==============================] - 2s 34us/step - loss: 0.1055 - acc: 0.9679
Epoch 3/5
60000/60000 [==============================] - 2s 33us/step - loss: 0.0688 - acc: 0.9791
Epoch 4/5
60000/60000 [==============================] - 2s 35us/step - loss: 0.0504 - acc: 0.9848
Epoch 5/5
60000/60000 [==============================] - 2s 38us/step - loss: 0.0373 - acc: 0.9889
10000/10000 [==============================] - 0s 18us/step
test_acc:  0.9791
如本文所述:

softmax函数将输出类成员的概率 每个类标记并尝试最好地接近预期目标 对于给定的输入

例如,如果整数编码的类1预期为1 例如,目标向量为:

[0,1,0]softmax输出可能如下所示,这将 第一类的重量最大,其他类的重量较小

[0.09003057 0.66524096 0.24472847]

然后在这两组数据上计算均方误差,根据
to_category
输出的真实标签
y_true
,预测标签
y_pred
为网络的softmax输出

从tensorflow源代码开始,它通过以下方式工作:

  • 首先计算
    y_true
    y_pred
    之间的差值,并将结果与上述两个值进行平方运算:
  • 将tensorflow导入为tf
    从tensorflow.python.keras将后端导入为K
    从tensorflow.python.ops导入数学运算
    y_true=[0,0,0,1,0,0,0,0,0,0]
    y_pred=[0.033,0.45,0.01,0.9,0,0,0.5,0.4,0.3,0.95]
    数学运算平方差(y_pred,y_true)
    
  • 然后是结果的平均值:
  • K.平均值(数学运算平方差(y_pred,y_true))
    
    显然,这只是一个示例,但它以与以下简化示例相同的方式处理多维计算:

    K.mean(math_ops.squared_difference(y_pred, y_true))
    <tf.Tensor: shape=(), dtype=float32, numpy=0.1616189>
    
    >>y_true=[[1,0],[0,1]]
    >>>y_pred=[[0.95,0.03],[0.3,0.8]]
    >>>K.均值(数学运算平方差(y_pred,y_true))
    
    你可以看到每次的结果都是一个数字,这就是你的损失

    [
     [0,0,0,1,0,0,0,0,0,0],...  <--- One of these per training row
    ]
    
    [0.033,0.45,0.01,0.9,0,0,0.5,0.4,0.3,0.95]
    
    import tensorflow as tf
    from tensorflow.python.keras import backend as K
    from tensorflow.python.ops import math_ops
    
    y_true = [0,0,0,1,0,0,0,0,0,0]
    y_pred = [0.033,0.45,0.01,0.9,0,0,0.5,0.4,0.3,0.95]
    
    math_ops.squared_difference(y_pred, y_true)
    
    
    <tf.Tensor: shape=(10,), dtype=float32, numpy=
    array([1.0890000e-03, 2.0249999e-01, 9.9999997e-05, 1.0000004e-02,
           0.0000000e+00, 0.0000000e+00, 2.5000000e-01, 1.6000001e-01,
           9.0000004e-02, 9.0249997e-01], dtype=float32)>
    
    K.mean(math_ops.squared_difference(y_pred, y_true))
    <tf.Tensor: shape=(), dtype=float32, numpy=0.1616189>
    
    >>> y_true = [[1,0],[0,1]]
    >>> y_pred = [[0.95,0.03],[0.3,0.8]]
    >>> K.mean(math_ops.squared_difference(y_pred, y_true))
    
    <tf.Tensor: shape=(), dtype=float32, numpy=0.03335>