Keras 自定义损失函数中 y_true 的大小
Size of y_true in custom loss function of Keras
我正在尝试在 Keras 中为 U-net 编写一个自定义损失函数,它的 objective 不仅要计算预测图像和真实图像的均方误差 (MSE),还有它们梯度的均方误差。
我不确定这是否正常,但我自定义的损失函数中 y_true
的形状是 (None, None, None, None) 即使从下面的 ,我期望 y_true 的大小与 y_pred 相同,在我的例子中,它的大小应该是:(batch_size, 128, 256, 3).
我已经列出了我为自定义损失函数编写的代码,如果有人可以提供任何建议,我将不胜感激。
import tensorflow.keras.backend as K
# Encouraging the predicted image to match the label not only in image domain, but also in gradient domain
def keras_customized_loss(batch_size, lambda1 = 1.0, lambda2 = 0.05):
def grad_x(image):
out = K.zeros((batch_size,)+image.shape[1:4])
out = K.abs(image[0:batch_size, 1:, :, :] - image[0:batch_size, :-1, :, :])
return out
def grad_y(image):
out = K.zeros((batch_size,)+image.shape[1:4])
out = K.abs(image[0:batch_size, :, 1:, :] - image[0:batch_size, :, :-1, :])
return out
#OBS: Now y_true has size: (None, None, None, None), figure out how to solve it
def compute_loss(y_true, y_pred):
pred_grad_x = grad_x(y_pred)
pred_grad_y = grad_y(y_pred)
true_grad_x = grad_x(y_true)
true_grad_y = grad_y(y_true)
loss1 = K.mean(K.square(y_pred-y_true))
loss2 = K.mean(K.square(pred_grad_x-true_grad_x))
loss3 = K.mean(K.square(pred_grad_y-true_grad_y))
return (lambda1*loss1+lambda2*loss2+lambda2*loss3)
return compute_loss
model.compile(optimizer='adam', loss = keras_customized_loss(BATCH_SIZE), metrics=['MeanAbsoluteError'])
None
表示它接受可变大小。
所以你的自定义损失可以非常灵活。
真正的大小自然是你传给fit
的那批数据的大小。
如果您的数据具有 (samples, 128,256,3)
形状,则无需担心。
但是你的代码中有很多不必要的东西,你可以:
def keras_customized_loss(lambda1 = 1.0, lambda2 = 0.05):
def grad_x(image):
return K.abs(image[:, 1:] - image[:, :-1])
def grad_y(image):
return K.abs(image[:, :, 1:] - image[:, :, :-1])
def compute_loss(y_true, y_pred):
pred_grad_x = grad_x(y_pred)
pred_grad_y = grad_y(y_pred)
true_grad_x = grad_x(y_true)
true_grad_y = grad_y(y_true)
loss1 = K.mean(K.square(y_pred-y_true))
loss2 = K.mean(K.square(pred_grad_x-true_grad_x))
loss3 = K.mean(K.square(pred_grad_y-true_grad_y))
return (lambda1*loss1+lambda2*loss2+lambda2*loss3)
return compute_loss
我正在尝试在 Keras 中为 U-net 编写一个自定义损失函数,它的 objective 不仅要计算预测图像和真实图像的均方误差 (MSE),还有它们梯度的均方误差。
我不确定这是否正常,但我自定义的损失函数中 y_true
的形状是 (None, None, None, None) 即使从下面的
我已经列出了我为自定义损失函数编写的代码,如果有人可以提供任何建议,我将不胜感激。
import tensorflow.keras.backend as K
# Encouraging the predicted image to match the label not only in image domain, but also in gradient domain
def keras_customized_loss(batch_size, lambda1 = 1.0, lambda2 = 0.05):
def grad_x(image):
out = K.zeros((batch_size,)+image.shape[1:4])
out = K.abs(image[0:batch_size, 1:, :, :] - image[0:batch_size, :-1, :, :])
return out
def grad_y(image):
out = K.zeros((batch_size,)+image.shape[1:4])
out = K.abs(image[0:batch_size, :, 1:, :] - image[0:batch_size, :, :-1, :])
return out
#OBS: Now y_true has size: (None, None, None, None), figure out how to solve it
def compute_loss(y_true, y_pred):
pred_grad_x = grad_x(y_pred)
pred_grad_y = grad_y(y_pred)
true_grad_x = grad_x(y_true)
true_grad_y = grad_y(y_true)
loss1 = K.mean(K.square(y_pred-y_true))
loss2 = K.mean(K.square(pred_grad_x-true_grad_x))
loss3 = K.mean(K.square(pred_grad_y-true_grad_y))
return (lambda1*loss1+lambda2*loss2+lambda2*loss3)
return compute_loss
model.compile(optimizer='adam', loss = keras_customized_loss(BATCH_SIZE), metrics=['MeanAbsoluteError'])
None
表示它接受可变大小。
所以你的自定义损失可以非常灵活。
真正的大小自然是你传给fit
的那批数据的大小。
如果您的数据具有 (samples, 128,256,3)
形状,则无需担心。
但是你的代码中有很多不必要的东西,你可以:
def keras_customized_loss(lambda1 = 1.0, lambda2 = 0.05):
def grad_x(image):
return K.abs(image[:, 1:] - image[:, :-1])
def grad_y(image):
return K.abs(image[:, :, 1:] - image[:, :, :-1])
def compute_loss(y_true, y_pred):
pred_grad_x = grad_x(y_pred)
pred_grad_y = grad_y(y_pred)
true_grad_x = grad_x(y_true)
true_grad_y = grad_y(y_true)
loss1 = K.mean(K.square(y_pred-y_true))
loss2 = K.mean(K.square(pred_grad_x-true_grad_x))
loss3 = K.mean(K.square(pred_grad_y-true_grad_y))
return (lambda1*loss1+lambda2*loss2+lambda2*loss3)
return compute_loss