将输入层与另一个顺序模型一起传递到自定义损失函数

时间:2019-04-22 15:22:20

标签: python tensorflow keras

我正在尝试使用TensorFlow 2.0为Keras模型编写自定义损失函数。我按照类似答案中的说明进行操作,以使输入层进入损耗函数,如

这里

Keras custom loss function: Accessing current input pattern

在这里

https://datascience.stackexchange.com/questions/25029/custom-loss-function-with-additional-parameter-in-keras

但是我还想将第二个模型的输出添加到损失函数中。

错误似乎来自v.predict(x)。起初TensorFlow给出了类似的错误 ValueError:将数据张量用作模型的输入时,应指定steps参数。

所以我尝试添加步骤arg v.predict(x,steps = n),其中n是一些整数,我得到 AttributeError:“ Tensor”对象没有属性“ numpy”

X =一些np.random数组 Y = X加上噪声的某些函数

def build_model():
    il = tf.keras.Input(shape=(2,),dtype=tf.float32)
    outl = kl.Dense(100,activation='relu')(il)
    outl = kl.Dense(50,activation='relu')(outl)
    outl = kl.Dense(1)(outl)
    return il,outl

def f(X,a):
    return (X[:,0:1] + theta*a)*a

def F(x,a):
    eps = tf.random.normal(tf.shape(x),mean=loc,stddev=scale)[:,0:1]
    z = tf.stack([x[:,0:1] + theta*a + eps,x[:,1:] - a],axis=1)[:,:,0]
    return z

def c_loss(x=None,v=None):
    def loss(y_true,y_pred):
        xp = F(x,y_pred)
        return kb.mean(f(x,y_pred) + v.predict(xp)) 
    return loss

v_in,v_out = build_model()
v_model = tf.keras.Model(inputs=v_in,outputs=v_out)
v_model.compile(tf.keras.optimizers.Adam(),loss='mean_squared_error')
v_model.fit(x=X,y=Y)

c_in,c_out = build_model()
c_model = tf.keras.Model(inputs=c_in,outputs=c_out)
c_model.compile(tf.keras.optimizers.Adam(),loss=c_loss(x=c_in,v=v_model))
c_model.fit(x=X,y=Y_dummy)

理想情况下,我只是希望调用c_model.fit()来构建神经网络,以最小化功能f(x,a)+ v(x)。

1 个答案:

答案 0 :(得分:0)

我找到了答案here。我遇到了“步骤”错误,但实际的问题是“ numpy”错误。我在程序的开头添加了tf.enable_eager_execution()来照顾它。