使用 min_g(g, g*) 自定义 keras 损失函数
Customized keras loss function using min_g(g, g*)
我正在处理给定图像的回归问题,我想预测 3 个参数(笛卡尔坐标)的值。对于同一张图片,我可以有几个可接受的坐标。为此,我使用了一个使用 keras 的神经网络。为了训练我的网络,我想实现一个自定义损失函数,该函数将计算预测值与最接近的可接受值之间的欧几里得距离。在数学术语中可以这样表示:

的形状是
,我的目标
的形状是
。
为了计算这个损失,我首先重塑
以获得正确的形状。然后我执行损失计算(使用tensorflow 1.13):
import tensorflow as tf
import tensorflow.keras.backend as K
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
K.set_session(tf.Session(config=config))
from tensorflow.python.keras.applications import ResNet50
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Dropout
import numpy as np
def min_mse(y_pred, y_true):
y_pred_temp = K.repeat(y_pred, K.shape(y_true)[1])
return K.min(K.sum(K.sqrt(y_pred_temp-y_true), axis=-1), axis=-1)
def resnet_model():
model = Sequential()
model.add(ResNet50(include_top=False, pooling='avg', weights='imagenet'))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(rate=0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(rate=0.2))
model.add(Dense(3, activation='linear'))
model.layers[0].trainable = False
model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001), loss=min_mse)
return model
X = np.random.random((200, 224, 224, 3))
Y = np.random.random((200, 10, 3))
model = resnet_model()
model.fit(X, Y)
然而,这段代码输出错误
tensorflow.python.framework.errors_impl.InvalidArgumentError: Expected multiples argument to be a vector of length 4 but got length 3
[[{{node loss/dense_2_loss/Tile}}]]
我在解决它时遇到了一些麻烦,因为我无法轻松打印不同张量的形状来理解问题。
您是否知道如何解决此问题(通过修复我的代码或使用其他方法)?
提前致谢。
从Kera's documentation可以看出,当您定义自定义指标时,标签作为自定义损失的第一个参数,预测作为第二个参数。
只需交换 y_true 和 y_pred,您的代码应该 运行 :
def min_mse(y_true, y_pred):
y_pred_temp = K.repeat(y_pred, K.shape(y_true)[1])
return K.min(K.sum(K.sqrt(y_pred_temp-y_true), axis=-1), axis=-1)
我正在处理给定图像的回归问题,我想预测 3 个参数(笛卡尔坐标)的值。对于同一张图片,我可以有几个可接受的坐标。为此,我使用了一个使用 keras 的神经网络。为了训练我的网络,我想实现一个自定义损失函数,该函数将计算预测值与最接近的可接受值之间的欧几里得距离。在数学术语中可以这样表示:
的形状是
,我的目标
的形状是
。
为了计算这个损失,我首先重塑 以获得正确的形状。然后我执行损失计算(使用tensorflow 1.13):
import tensorflow as tf
import tensorflow.keras.backend as K
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
K.set_session(tf.Session(config=config))
from tensorflow.python.keras.applications import ResNet50
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Dropout
import numpy as np
def min_mse(y_pred, y_true):
y_pred_temp = K.repeat(y_pred, K.shape(y_true)[1])
return K.min(K.sum(K.sqrt(y_pred_temp-y_true), axis=-1), axis=-1)
def resnet_model():
model = Sequential()
model.add(ResNet50(include_top=False, pooling='avg', weights='imagenet'))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(rate=0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(rate=0.2))
model.add(Dense(3, activation='linear'))
model.layers[0].trainable = False
model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001), loss=min_mse)
return model
X = np.random.random((200, 224, 224, 3))
Y = np.random.random((200, 10, 3))
model = resnet_model()
model.fit(X, Y)
然而,这段代码输出错误
tensorflow.python.framework.errors_impl.InvalidArgumentError: Expected multiples argument to be a vector of length 4 but got length 3 [[{{node loss/dense_2_loss/Tile}}]]
我在解决它时遇到了一些麻烦,因为我无法轻松打印不同张量的形状来理解问题。 您是否知道如何解决此问题(通过修复我的代码或使用其他方法)? 提前致谢。
从Kera's documentation可以看出,当您定义自定义指标时,标签作为自定义损失的第一个参数,预测作为第二个参数。
只需交换 y_true 和 y_pred,您的代码应该 运行 :
def min_mse(y_true, y_pred):
y_pred_temp = K.repeat(y_pred, K.shape(y_true)[1])
return K.min(K.sum(K.sqrt(y_pred_temp-y_true), axis=-1), axis=-1)