在keras自定义损失函数内的input_tensor上调用K.eval()?

时间:2019-01-27 05:32:31

标签: keras

在按照说明here进行操作之后,我试图将输入张量转换为自定义keras损失函数中的numpy数组。

以上代码在我的计算机上运行,​​没有错误。现在,我想使用输入张量中的值提取一个numpy数组。但是,出现以下错误:

  

“ tensorflow.python.framework.errors_impl.InvalidArgumentError:您   必须使用dtype float
输入占位符张量'input_1'的值   [[节点:input_1 = Placeholderdtype = DT_FLOAT,shape = [],   _device =“ / job:localhost / replica:0 / task:0 / cpu:0”]]“

我需要转换为一个numpy数组,因为我还有其他必须在输入上运行的keras模型-我没有在joint_loss中显示下面的那些行,但是即使下面的代码示例也根本无法运行。

import numpy as np
from keras.models import Model, Sequential
from keras.layers import Dense, Activation, Input
import keras.backend as K

def joint_loss_wrapper(x):
    def joint_loss(y_true, y_pred):
        x_val = K.eval(x)
        return y_true - y_pred
    return joint_loss


input_tensor = Input(shape=(6,))
hidden1 = Dense(30, activation='relu')(input_tensor)
hidden2 = Dense(40, activation='sigmoid')(hidden1)
out = Dense(1, activation='sigmoid')(hidden2)
model = Model(input_tensor, out)
model.compile(loss=joint_loss_wrapper(input_tensor), optimizer='adam')

1 个答案:

答案 0 :(得分:0)

我知道了! 您要做的是使用Keras的Functional API。
然后,可以将您的子模型输出为张量作为y_pred_submodel = submodel(x)
这类似于Keras层在张量上的操作方式。
仅在损失函数内操纵张量。那应该很好。