我正在尝试实现自定义丢失函数,该函数提供加权像素方式的交叉熵值。
我使用" sample_weight_mode =' temporal'"编译模型,并为每个单独的图像传递不同的权重。我有以下内容:
model.fit_generator(train_generator,...)
其中,train_generator产生具有以下尺寸的(input_image,target_label,weight)元组:
input_image -> (48, 64, 64, 1)
target_label -> (196608, 1)
weight -> (196608,)
是否可以实现一个损失函数来获得相应的权重作为参数?如果可以实现如下所示的功能,请问有谁可以告诉我吗?
def pixelwise_cross_entropy(target, output, weight):
#~ target = tf.convert_to_tensor(target, dtype=tf.float32)
#~ output = tf.convert_to_tensor(output, dtype=tf.float32)
_EPSILON = 10e-8
output /= tf.reduce_sum(output, axis=len(output.get_shape()) - 1, keep_dims=True)
epsilon = tf.cast(tf.convert_to_tensor(_EPSILON), output.dtype.base_dtype)
output = tf.clip_by_value(output, epsilon, 1. - epsilon)
return - tf.reduce_sum(target * tf.log(output) * weight, axis=len(output.get_shape()) - 1)
重量图是目标的形态侵蚀版本。我试图在自定义损失函数本身中创建权重贴图。由于我的数据是3D,我不能使用tensorflow" tf.nn.erosion2d"。
我无法将张量对象转换为numpy数组来执行此操作,因为它会产生以下负尺寸错误。
tensorflow.python.framework.errors_impl.InvalidArgumentError: Shape [-1,-1,-1] has negative dimensions
[[Node: mask_target = Placeholder[dtype=DT_FLOAT, shape=[?,?,?], _device="/job:localhost/replica:0/task:0/gpu:0"]()]]
如果您对此有所了解或遇到类似问题,有人可以帮忙吗?