在keras自定义损失函数中获取训练数据形状

问题描述 投票:1回答:1

我编写了以下自定义损失函数,在这里我需要通过将输入形状除以输出形状来创建一个因子。

def distance_loss(x,y):
    x_shape = K.int_shape(x)[1]
    y_shape = K.int_shape(y)[1]
    print(x_shape,y_shape)
    factor = x_shape/y_shape
    loss = tf.sqrt(factor) * tf.norm(x-y)
    return tf.math.abs(loss)

这是模型架构,是:

model = Sequential()
model.add(Dense(32,input_dim=4))
model.add(Dense(64,activation='relu'))
model.add(Dense(128,activation='relu'))
model.add(Dense(64,activation='relu'))
model.add(Dense(2,activation='relu'))
opt = Adam(lr = 0.001)
model.compile(optimizer = opt, loss=distance_loss,metrics=['accuracy'])

当我运行model.compile行时。自定义损失打印

无2

并引发错误

TypeError:/:'NoneType'和'int'的不受支持的操作数类型

我了解到,训练数据的输入形状仅在训练阶段才知道。有什么办法可以绕过这个问题?

python tensorflow keras
1个回答
1
投票

改为使用K.shape

def distance_loss(x,y):
    x_shape = K.shape(x)[1]
    y_shape = K.shape(y)[1]
    factor = K.cast(x_shape, x.dtype) / K.cast(y_shape, y.dtype)
    loss = tf.sqrt(factor) * tf.norm(x-y)
    return tf.math.abs(loss)
© www.soinside.com 2019 - 2024. All rights reserved.