我有自己的自定义损失函数
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。代码现在没有那么复杂,但这不是问题,因为它仍然产生相同的错误。