如何在简单的数学运算中定义keras自定义损失函数

时间:2018-10-09 07:43:13

标签: python-3.x tensorflow keras loss-function

我定义了一个自定义函数my_sigmoid,如下所示:

import math
def my_sigmoid(x):
    a =  1/  ( 1+math.exp( -(x-300)/30 ) )
    return a

然后定义一个名为my_cross_entropy的自定义损失函数:

import keras.backend as K

def my_cross_entropy(y_true, y_pred):
    diff = abs(y_true-y_pred)
    y_pred_transform = my_sigmoid(diff)
    return K.categorical_crossentropy(0, y_pred_transform)

我的keras后端正在使用tensorflow。 错误显示

  
    

TypeError:必须为实数,而不是张量

  

我不熟悉tensorflow,也不知道如何使用自定义损失。

以下是我的模型结构和错误消息:

import keras.backend as K
from keras.models import Sequential
from keras.layers import Conv2D, Dropout, Flatten, Dense

model=Sequential()
model.add(Conv2D(512,(5,X_train.shape[2]),input_shape=X_train.shape[1:4],activation="relu"))
model.add(Flatten())
model.add(Dropout(0.1))
model.add(Dense(100,activation="relu"))
model.add(Dense(100,activation="relu"))
model.add(Dense(50,activation="relu"))
model.add(Dense(10,activation="relu"))
model.add(Dense(1,activation="relu"))
model.compile(optimizer='adam', loss=my_cross_entropy)
model.fit(X_train,Y_train,batch_size = 10,epochs=200,validation_data=(X_test,Y_test))

enter image description here

X_trainY_train的形状为: (120, 30, 80, 1)(120,)

1 个答案:

答案 0 :(得分:2)

更改

diff = abs(y_true-y_pred)

进入

diff = K.abs(y_true-y_pred)

相同
math.exp()

将其更改为

K.exp()

abs和Math.exp是无法处理张量的函数。如果仍有问题,请参考:Custom Loss function Keras Tensorflow