Tensorflow的DNNLinearCombinedClassifier打印回归损失而不是分类丢失

时间:2017-10-13 12:18:54

标签: python machine-learning tensorflow deep-learning

我正在Kaggle's Credit Card Fraud(分类)数据集上尝试Tensorflow的DNNLinearCombinedClassifier(版本1.3):

m = tf.estimator.DNNLinearCombinedClassifier(model_dir='/.../model', dnn_feature_columns=deep_columns,
                                            dnn_hidden_units=[20,5])

def input_fn(df, num_epochs):
    return tf.estimator.inputs.pandas_input_fn(
        x = df,
        y = df.Class,
        batch_size = 1000,
        num_epochs = num_epochs,
        shuffle=False)

将模型的输出(此处为 df.Class )作为二进制特征。 Tensorflow登录培训

m.train(input_fn(data, 3))

是:

  

INFO:tensorflow: loss = 532.633 ,步骤= 2566   信息:tensorflow:global_step / sec:37.9815 INFO:tensorflow:loss =   560.574,step = 2666(2.635 sec)INFO:tensorflow:global_step / sec:38.3186

这里使用的损失函数是什么?

2 个答案:

答案 0 :(得分:1)

  

这里使用的损失函数是什么?

在二进制分类的情况下,它是_BinaryLogisticHeadWithSigmoidCrossEntropyLoss - tf.nn.sigmoid_cross_entropy_with_logits损失函数的内部包装器。你会被一个很大的值弄糊涂,但如果仔细观察这个函数计算的内容,你会发现很大的值是很有可能的。

如果x是对数,z是标签(单个示例),则损失等于x - x * z + log(1 + exp(-x)),与x相当, z == 0。总培训损失定义为小批量的损失总和。您的batch_size = 1000和数据有~30个功能,因此550周围的训练损失非常有意义。

看看这个微缩的例子:

feature_columns = [tf.feature_column.numeric_column("x", shape=[1])]
estimator = tf.estimator.DNNLinearCombinedClassifier(dnn_feature_columns=feature_columns,
                                                     dnn_hidden_units=[20, 5])

x_train = np.array([100., 20., 300., 40.])
y_train = np.array([0, 1, 0, 1])

input_fn = tf.estimator.inputs.numpy_input_fn(
    {"x": x_train}, y_train, batch_size=4, num_epochs=None, shuffle=True)
train_input_fn = tf.estimator.inputs.numpy_input_fn(
    {"x": x_train}, y_train, batch_size=4, num_epochs=1000, shuffle=False)
estimator.train(input_fn=input_fn, steps=1000)

这是运行时的输出:

INFO:tensorflow:loss = 32.7514, step = 1
INFO:tensorflow:global_step/sec: 30.5939
INFO:tensorflow:loss = 18.7906, step = 101 (3.099 sec)
INFO:tensorflow:global_step/sec: 32.3183
INFO:tensorflow:loss = 15.5917, step = 201 (1.175 sec)
INFO:tensorflow:global_step/sec: 88.6797

您可以想象,将batch_size4更改为1000会导致8000左右的丢失。所以,总之,没有什么可担心这种损失价值。

答案 1 :(得分:0)

根据deep-and-wide learning的原始出版物,他们使用逻辑损失函数进行联合训练。更具体地说,模型实现依赖于应用于softmax输出的交叉熵损失。

在应用逻辑回归之前,他们使用加权和来组合来自两个模型的对数 -

可以在源代码here中找到损失声明:

...        
head = head_lib._multi_class_head_with_softmax_cross_entropy_loss(  # pylint: disable=protected-access
              n_classes,
              weight_column=weight_column,
label_vocabulary=label_vocabulary)