Keras Model - Get input in custom loss function

走远了吗. 提交于 2021-01-28 10:12:04

问题


I am having trouble with Keras Custom loss function. I want to be able to access truth as a numpy array. Because it is a callback function, I think I am not in eager execution, which means I can't access it using the backend.get_value() function. i also tried different methods, but it always comes back to the fact that this 'Tensor' object doesn't exist.

Do I need to create a session inside the custom loss function ?

I am using Tensorflow 2.2, which is up to date.

def custom_loss(y_true, y_pred):

    # 4D array that has the label (0) and a multiplier input dependant
    truth = backend.get_value(y_true)

    loss = backend.square((y_pred - truth[:,:,0]) * truth[:,:,1])
    loss = backend.mean(loss, axis=-1)  

    return loss

 model.compile(loss=custom_loss, optimizer='Adam')
 model.fit(X, np.stack(labels, X[:, 0], axis=3), batch_size = 16)


I want to be able to access truth. It has two components (Label, Multiplier that his different for each item. I saw a solution that is input dependant, but I am not sure how to access the value. Custom loss function in Keras based on the input data


回答1:


I think you can do this by enabling run_eagerly=True in model.compile as shown below.

model.compile(loss=custom_loss(weight_building, weight_space),optimizer=keras.optimizers.Adam(), metrics=['accuracy'],run_eagerly=True)

I think you also need to update custom_loss as shown below.

def custom_loss(weight_building, weight_space):
  def loss(y_true, y_pred):
    truth = backend.get_value(y_true)
    error = backend.square((y_pred - y_true))
    mse_error = backend.mean(error, axis=-1) 
    return mse_error
  return loss

I am demonstrating the idea with a simple mnist data. Please take a look at the code here.



来源:https://stackoverflow.com/questions/61761715/keras-model-get-input-in-custom-loss-function

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!