Python Keras自定义损失函数:随批次大小形状变化(y_真)
在Keras中实现自定义损失函数时,我需要一个带有输入数据批大小形状的Python Keras自定义损失函数:随批次大小形状变化(y_真),python,tensorflow,keras,deep-learning,loss-function,Python,Tensorflow,Keras,Deep Learning,Loss Function,在Keras中实现自定义损失函数时,我需要一个带有输入数据批大小形状的tf.变量(y\u true,y\u pred) 但是,这会产生错误: You must feed a value for placeholder tensor 'dense_17_target' with dtype float and shape [?,?] 如果我将批次大小固定为一个值: def custom_loss(y_true, y_pred): counter = tf.Variable(tf.zer
tf.变量
(y\u true,y\u pred)
但是,这会产生错误:
You must feed a value for placeholder tensor 'dense_17_target' with dtype float and shape [?,?]
如果我将批次大小固定为一个值:
def custom_loss(y_true, y_pred):
counter = tf.Variable(tf.zeros(batch_size, dtype=tf.float32))
...
使| training|u set |%batch|u size
和| val|u set |%batch|u size
等于零,一切正常
是否有任何建议,为什么根据输入的形状(y\u true
和y\u pred
)分配批量大小的变量不起作用
解决方案
我找到了一个令人满意的解决方案。
我使用可能的最大批量大小(在模型构建期间指定)初始化变量,并仅使用K.shape(y\u true)[0]
对变量进行切片。那样的话,它工作得很好。代码如下:
def custom_loss(y_true, y_pred):
counter = tf.Variable(tf.zeros(batch_size, dtype=tf.float32))
...
true_counter = counter[:K.shape(y_true)[0]]
...
它不起作用,因为
K.shape
返回一个符号形状,它本身是张量,而不是int值的元组。要从张量中获取值,必须在会话下对其求值。看看这个。要在计算时间之前获得实际值,请使用K.int\u shape
:
但是,K.int\u shape
在这里也不起作用,因为它只是一些静态元数据,通常不会反映当前的批大小,而是有一个占位符值None
您找到的解决方案(控制批量大小并在损失中使用)确实是一个很好的解决方案
我相信问题是因为您需要在定义时知道批量大小来构建变量,但它只在会话运行时才知道
如果将其作为张量使用,则应该可以,请参见此。另一种解决方案是使用
tf创建一个变量并动态更改其形状。使用validate\u shape=False分配:
counter = tf.Variable(0.0)
...
val = tf.zeros(tf.shape(y_true)[:1], 0.0)
counter = tf.assign(counter, val, validate_shape=False)
非常感谢您的投入!特别是用张量处理批量大小的不同方法,使我找到了解决方案。
counter = tf.Variable(0.0)
...
val = tf.zeros(tf.shape(y_true)[:1], 0.0)
counter = tf.assign(counter, val, validate_shape=False)