Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Keras自定义损失函数:随批次大小形状变化(y_真)_Python_Tensorflow_Keras_Deep Learning_Loss Function - Fatal编程技术网

Python Keras自定义损失函数:随批次大小形状变化(y_真)

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

在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.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)