Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.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_Machine Learning_Keras_Deep Learning - Fatal编程技术网

Python Keras自定义损耗功能:访问当前输入模式

Python Keras自定义损耗功能:访问当前输入模式,python,tensorflow,machine-learning,keras,deep-learning,Python,Tensorflow,Machine Learning,Keras,Deep Learning,在Keras(带有Tensorflow后端)中,当前输入模式是否可用于我的自定义损失函数 当前输入模式定义为用于产生预测的输入向量。例如,考虑以下代码: xyStand、xyTest、yyStand、yyTest= TrimeTestSythRead(x,y,TestLySt= 0.33,RealthObjySt==42,Suffle=false)< /Cord>。然后,当前输入模式是与y_序列相关联的当前X_序列向量(在损失函数中称为y_真) 在设计自定义损耗函数时,我打算优化/最小化需要访问

在Keras(带有Tensorflow后端)中,当前输入模式是否可用于我的自定义损失函数

当前输入模式定义为用于产生预测的输入向量。例如,考虑以下代码:<代码> xyStand、xyTest、yyStand、yyTest= TrimeTestSythRead(x,y,TestLySt= 0.33,RealthObjySt==42,Suffle=false)< /Cord>。然后,当前输入模式是与y_序列相关联的当前X_序列向量(在损失函数中称为y_真)

在设计自定义损耗函数时,我打算优化/最小化需要访问当前输入模式的值,而不仅仅是当前预测

我已经看过了

我也看过了“

我还熟悉前面生成自定义损失函数的示例:

import keras.backend as K

def customLoss(y_true,y_pred):
    return K.sum(K.log(y_true) - K.log(y_pred))

大概
(y\u true,y\u pred)
是在别处定义的。我查看了源代码,但没有成功,我想知道是否需要自己定义当前的输入模式,或者我的损失函数是否已经可以访问它。

您可以将损失函数包装为一个内部函数,并将输入张量传递给它(与向loss函数传递附加参数时通常所做的一样)

def custom_loss_wrapper(input_tensor):
    def custom_loss(y_true, y_pred):
        return K.binary_crossentropy(y_true, y_pred) + K.mean(input_tensor)
    return custom_loss

input_tensor = Input(shape=(10,))
hidden = Dense(100, activation='relu')(input_tensor)
out = Dense(1, activation='sigmoid')(hidden)
model = Model(input_tensor, out)
model.compile(loss=custom_loss_wrapper(input_tensor), optimizer='adam')
您可以验证
input\u tensor
和损失值(主要是
K.mean(input\u tensor)
部分)将随着不同的
X
传递给模型而改变

X = np.random.rand(1000, 10)
y = np.random.randint(2, size=1000)
model.test_on_batch(X, y)  # => 1.1974642

X *= 1000
model.test_on_batch(X, y)  # => 511.15466

您可以使用
add_loss
将外部层传递给您的损失,在您的例子中是输入张量

这里有一个例子:

def CustomLoss(y_true, y_pred, input_tensor):
    return K.binary_crossentropy(y_true, y_pred) + K.mean(input_tensor)

X = np.random.uniform(0,1, (1000,10))
y = np.random.randint(0,2, 1000)

inp = Input(shape=(10,))
hidden = Dense(100, 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,y], y=None, epochs=3)
在推理模式下使用模型(从输入中删除目标)


这在tf.keras中不适用于急切执行。你知道怎么做吗?它不适用于
tf.keras
急切执行:(它说:
tensorflow.python.eager.core.\u symbolic异常:急切执行函数的输入不能是keras符号张量,但可以找到[]
final_model = Model(model.input[0], model.output)
final_model.predict(X)