Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自定义损耗功能使用Keras 2.1.4产生极低的损耗值_Python_Tensorflow_Keras_Loss Function - Fatal编程技术网

Python 自定义损耗功能使用Keras 2.1.4产生极低的损耗值

Python 自定义损耗功能使用Keras 2.1.4产生极低的损耗值,python,tensorflow,keras,loss-function,Python,Tensorflow,Keras,Loss Function,我正在使用数字和分类值(时间序列)的数据集。这是一个变量示例: A B C_1 C_2 D_1 D_2 D_3 前两个是数值变量,C和D是带有一个单选表示的分类变量 下面是我的自定义损失函数。我使用partial向函数传递两个以上的参数: def mixed_num_cat_loss_backend(y_true, y_pred, signals_splits): if isinstance(y_true, np.ndarray): y_true = keras.back

我正在使用数字和分类值(时间序列)的数据集。这是一个变量示例:
A B C_1 C_2 D_1 D_2 D_3

前两个是数值变量,C和D是带有一个单选表示的分类变量

下面是我的自定义损失函数。我使用partial向函数传递两个以上的参数:

def mixed_num_cat_loss_backend(y_true, y_pred, signals_splits):
    if isinstance(y_true, np.ndarray):
        y_true = keras.backend.variable( y_true )
    if isinstance(y_pred, np.ndarray):
        y_pred = keras.backend.variable( y_pred )

    y_true_mse = y_true[:,:signals_splits[0]] 
    y_pred_mse = y_pred[:,:signals_splits[0]]
    mse_loss_v = keras.backend.square(y_true_mse-y_pred_mse)

    categ_loss_v = [ keras.backend.categorical_crossentropy(
                             y_pred[:,signals_splits[i-1]:signals_splits[i]], #keras.backend.softmax(y_pred[:,signals_splits[i-1]:signals_splits[i]]), 
                             y_true[:,signals_splits[i-1]:signals_splits[i]], 
                         from_logits=False) # force keras to normalize
                    for i in range(1,len(signals_splits)) ]

    losses_v = keras.backend.concatenate( [mse_loss_v, keras.backend.stack(categ_loss_v,1)], 1)

    return losses_v
一个时期后,我的损失值极低:

Epoch 1/100
76s - loss: 0.1040 - acc: 0.1781 - val_loss: 0.0016 - val_acc: 0.1330  
Epoch 2/100  
75s - loss: 9.2523e-04 - acc: 0.1788 - val_loss: 8.7442e-04 - val_acc: 0.1330

关键是,我在使用Keras 2.0.4时没有这个问题。

自Keras 2.0.7以来,交叉熵后端方法的特征发生了变化。据报道,

后端方法
categorical\u crossentropy
sparse\u categorical\u crossentropy
binary\u crossentropy
的顺序为 它们的位置参数(
y_-true
y_-pred
)被反转。这一变化确实如此 不影响
损失
API。此更改是为了实现API
loss
API和后端API之间的一致性

因此,在较新版本的Keras中调用
categorical\u crossentropy
时,应该切换
y\u true
y\u pred
的位置