Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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模型的自定义损失函数给出错误答案_Python_Tensorflow_Keras - Fatal编程技术网

Python Keras模型的自定义损失函数给出错误答案

Python Keras模型的自定义损失函数给出错误答案,python,tensorflow,keras,Python,Tensorflow,Keras,我试图为keras NN模型编写一个自定义损失函数,但似乎损失函数输出了错误的值。我的损失函数是 def tangle_loss3(input_tensor): def custom_loss(y_true, y_pred): true_diff = y_true - input_tensor pred_diff = y_pred - input_tensor normalized_diff = K.abs(tf.math

我试图为keras NN模型编写一个自定义损失函数,但似乎损失函数输出了错误的值。我的损失函数是

def tangle_loss3(input_tensor):
    def custom_loss(y_true, y_pred):
        true_diff = y_true - input_tensor
        pred_diff = y_pred - input_tensor
        
        normalized_diff = K.abs(tf.math.divide(pred_diff, true_diff))
        normalized_diff = tf.reduce_mean(normalized_diff)
        
        return normalized_diff
    
    return custom_loss
然后我在这个简单的前馈网络中使用它:

input_layer = Input(shape=(384,), name='input')
hl_1 = Dense(64, activation='elu', name='hl_1')(input_layer)
hl_2 = Dense(32, activation='elu', name='hl_2')(hl_1)
hl_3 = Dense(32, activation='elu', name='hl_3')(hl_2)
output_layer = Dense(384, activation=None, name='output')(hl_3)

optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)

model = tf.keras.models.Model(input_layer, output_layer)
model.compile(loss=tangle_loss3(input_layer), optimizer=optimizer)
然后为了测试损失函数是否有效,我创建了一个随机输入和目标向量,并对我期望的结果进行了numpy计算,但这似乎与keras的结果不匹配

X = np.random.rand(1, 384)
y = np.random.rand(1, 384)

np.mean(np.abs((model.predict(X) - X)/(y - X)))
# returns some number 

model.test_on_batch(X, y)
# always returns 0.0

为什么我的损失函数总是返回零?这些答案是否匹配?

我误解了你的问题,我已经更新了我的方法。现在应该可以了。我将输入层和输出层堆叠起来,以获得传递给输出的新层


def tangle_loss3(y_true,y_pred):
true\u diff=y\u true-y\u pred[0]
pred_diff=y_pred[1]-y_pred[0]
标准化的_diff=tf.abs(tf.math.divide(pred_diff,true_diff))
标准化差异=tf.减少平均值(标准化差异)
返回标准化_diff
输入层=输入(形状=(384),名称=(输入)
hl_1=密集(64,激活='elu',名称='hl_1')(输入层)
hl_2=密集(32,激活='elu',名称='hl_2')(hl_1)
hl_3=密集(32,激活='elu',名称='hl_3')(hl_2)
输出层=密集(384,激活=无,名称=输出)(hl\U 3)
out=tf.stack([输入层,输出层])
优化器=tf.keras.optimizers.Adam(学习率=0.001)
model=tf.keras.models.model(输入层,输出层)
compile(loss=tangle\u loss3,optimizer=optimizer)
现在当我计算损失时,它起作用了


X=np.random.rand(1384)
y=np.random.rand(1384)
平均值(np.abs((模型预测(X)[1]-X)/(y-X)))
#返回一些数字
批量(X,y)上的模型试验

注意,我必须使用model.predict(X)[1],因为我们得到两个输出,输入层和输出层的结果。这只是一个简单的解决方案,但它很有效。

自定义丢失与单个非嵌套的
自定义丢失(y\u true,y\u pred)
配合得很好。您可以尝试为输出添加KERA层,然后在添加到培训管道之前尝试使用新标签作为
new\u label=label-input

现在只使用customloss