Tensorflow:自定义损失函数产生错误`ValueError:没有提供梯度`

时间:2021-04-08 14:25:17

标签: python tensorflow

我有自己的自定义损失函数

def CustomLoss(y_true, y_pred, input_tensor):

    #The third column is our odds tensor for this loss function
    gains = input_tensor[:, 2]
    gains_expanded = tf.expand_dims(gains,1)
        
    confidence_threashhold = tf.constant(.2, dtype=tf.float32)        
    confident_1 = tf.floor(tf.add(y_pred,confidence_threashhold))

    losses_a = tf.multiply(confident_1,y_true)   
    losses_b = tf.multiply(losses_a,gains_expanded)
    losses_c = tf.subtract(confident_1,losses_b)

    print(losses_c)
    return losses_c

all_data = pd.read_csv("mydata.csv")

X = all_data.iloc[:, 0:11]
y = all_data.type

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

# Define the scaler 
scaler = StandardScaler().fit(X_train)

# Scale the train set
X_train = scaler.transform(X_train)

# Scale the test set
X_test = scaler.transform(X_test)

inp = Input(shape=(11,))
hidden = Dense(10, activation='relu')(inp)
out = Dense(1, activation='sigmoid')(hidden)
target = Input((1,))
model = Model([inp,target], out)

model.add_loss( CustomLoss( target, out, inp ) )
model.compile(  loss=None, 
                optimizer='adam')
model.fit(x=[X_train,y_train], batch_size=1, y=None, epochs=30, verbose=1)

当(例如)在自定义损失函数中我返回 K.binary_crossentropy(y_true, y_pred)

时,模型工作正常

据我调试,我返回的损失的形状是:shape=(None, 1)K.binary_crossentropy(y_true, y_pred)

的形状相同

不过,当我从 K.binary_crossentropy(y_true, y_pred) 切换到我的损失时,我得到: ValueError: No gradients provided for any variable: ['dense/kernel:0', 'dense/bias:0', 'dense_1/kernel:0', 'dense_1/bias:0'].

我自己的损失函数如何使它在层上没有梯度?我错过了什么?

编辑:根据 Lescurel 的回答,我删除了我在损失函数中执行的类型转换,将其替换为 tf.math.floor。代码现在没有那么复杂,但这不是问题,因为它仍然产生相同的错误。

0 个答案:

没有答案